Fix the cmpiling all sources with rebar
parent
13e1421430
commit
523ed4bd70
|
@ -0,0 +1,12 @@
|
||||||
|
{application, erlmines,
|
||||||
|
[
|
||||||
|
{description, ""},
|
||||||
|
{vsn, "1"},
|
||||||
|
{registered, [erlmines_app, erlmines_sup, erlmines]},
|
||||||
|
{applications, [
|
||||||
|
kernel,
|
||||||
|
stdlib
|
||||||
|
]},
|
||||||
|
{mod, { erlmines_app, []}},
|
||||||
|
{env, []}
|
||||||
|
]}.
|
|
@ -0,0 +1,136 @@
|
||||||
|
%% @author Masahito Ikuta <cooldaemon@gmail.com> [http://d.hatena.ne.jp/cooldaemon/]
|
||||||
|
%% @copyright Masahito Ikuta 2008
|
||||||
|
%% @doc UDP Server Behaviour.
|
||||||
|
|
||||||
|
%% Copyright 2008 Masahito Ikuta
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
|
||||||
|
-module(udp_server).
|
||||||
|
-behaviour(supervisor).
|
||||||
|
|
||||||
|
-include("udp_server.hrl").
|
||||||
|
|
||||||
|
-export([behaviour_info/1]).
|
||||||
|
|
||||||
|
-export([start_link/1, start_link/2, start_link/3]).
|
||||||
|
-export([stop/0, stop/1]).
|
||||||
|
-export([init/1]).
|
||||||
|
|
||||||
|
-export([receiver_start_link/3]).
|
||||||
|
-export([receiver_init/3]).
|
||||||
|
|
||||||
|
% Behaviour Callbacks
|
||||||
|
behaviour_info(callbacks) -> [{handle_call, 4}, {handle_info, 2}];
|
||||||
|
behaviour_info(_Other) -> undefined.
|
||||||
|
|
||||||
|
% Supervisor
|
||||||
|
%% External APIs
|
||||||
|
start_link(Module) ->
|
||||||
|
start_link(Module, #udp_server_option{}).
|
||||||
|
|
||||||
|
start_link(RegistName, Module) when is_atom(Module) ->
|
||||||
|
start_link(RegistName, Module, #udp_server_option{});
|
||||||
|
start_link(Module, Option) ->
|
||||||
|
start_link({local, ?MODULE}, Module, Option).
|
||||||
|
|
||||||
|
start_link({Dest, Name}=RegistName, Module, Option) ->
|
||||||
|
supervisor:start_link(
|
||||||
|
{Dest, supervisor_name(Name)},
|
||||||
|
?MODULE,
|
||||||
|
[RegistName, Module, Option]
|
||||||
|
).
|
||||||
|
|
||||||
|
stop() ->
|
||||||
|
stop(?MODULE).
|
||||||
|
|
||||||
|
stop(Name) ->
|
||||||
|
case whereis(supervisor_name(Name)) of
|
||||||
|
Pid when is_pid(Pid) ->
|
||||||
|
exit(Pid, normal),
|
||||||
|
ok;
|
||||||
|
_ -> not_started
|
||||||
|
end.
|
||||||
|
|
||||||
|
supervisor_name(Name) ->
|
||||||
|
list_to_atom(atom_to_list(Name) ++ "_sup").
|
||||||
|
|
||||||
|
%% Callbacks
|
||||||
|
init([{_Dest, Name}=RegistName, Module, Option]) ->
|
||||||
|
#udp_server_option{
|
||||||
|
max_restarts = MaxRestarts,
|
||||||
|
time = Time,
|
||||||
|
shutdown = Shutdown
|
||||||
|
} = Option,
|
||||||
|
{ok, {{one_for_one, MaxRestarts, Time}, [
|
||||||
|
{
|
||||||
|
Name,
|
||||||
|
{?MODULE, receiver_start_link, [RegistName, Module, Option]},
|
||||||
|
permanent,
|
||||||
|
Shutdown,
|
||||||
|
worker,
|
||||||
|
[]
|
||||||
|
}
|
||||||
|
]}}.
|
||||||
|
|
||||||
|
% ProcLib - udp_server_receiver
|
||||||
|
%% External APIs
|
||||||
|
receiver_start_link({Dest, Name}, Module, Option) ->
|
||||||
|
{ok, Pid}
|
||||||
|
= proc_lib:start_link(?MODULE, receiver_init, [self(), Module, Option]),
|
||||||
|
case Dest of
|
||||||
|
local -> register(Name, Pid);
|
||||||
|
_Global -> global:register_name(Name, Pid)
|
||||||
|
end,
|
||||||
|
{ok, Pid}.
|
||||||
|
|
||||||
|
%% Callbacks
|
||||||
|
receiver_init(Parent, Module, Option) ->
|
||||||
|
case gen_udp:open(
|
||||||
|
Option#udp_server_option.port,
|
||||||
|
Option#udp_server_option.option
|
||||||
|
) of
|
||||||
|
{ok, Socket} ->
|
||||||
|
proc_lib:init_ack(Parent, {ok, self()}),
|
||||||
|
recv(
|
||||||
|
proplists:get_value(active, Option#udp_server_option.option),
|
||||||
|
Socket, Module, Option
|
||||||
|
);
|
||||||
|
{error, Reason} ->
|
||||||
|
exit({error, Reason})
|
||||||
|
end.
|
||||||
|
|
||||||
|
recv(false, Socket, Module, Option) ->
|
||||||
|
case gen_udp:recv(
|
||||||
|
Socket,
|
||||||
|
Option#udp_server_option.recv_length,
|
||||||
|
Option#udp_server_option.recv_timeout
|
||||||
|
) of
|
||||||
|
{ok, {Address, Port, Packet}} ->
|
||||||
|
Module:handle_call(Socket, Address, Port, Packet),
|
||||||
|
recv(false, Socket, Module, Option);
|
||||||
|
{error, Reason} ->
|
||||||
|
exit({error, Reason})
|
||||||
|
end;
|
||||||
|
|
||||||
|
recv(_Active, Socket, Module, Option) ->
|
||||||
|
receive
|
||||||
|
{udp, Socket, Address, Port, Packet} ->
|
||||||
|
Module:handle_call(Socket, Address, Port, Packet),
|
||||||
|
recv(true, Socket, Module, Option);
|
||||||
|
OtherMessage ->
|
||||||
|
Module:handle_info(Socket, OtherMessage),
|
||||||
|
recv(true, Socket, Module, Option)
|
||||||
|
after Option#udp_server_option.recv_timeout ->
|
||||||
|
exit({error, udp_timeout})
|
||||||
|
end.
|
|
@ -0,0 +1,39 @@
|
||||||
|
%% @author Masahito Ikuta <cooldaemon@gmail.com> [http://d.hatena.ne.jp/cooldaemon/]
|
||||||
|
%% @copyright Masahito Ikuta 2008
|
||||||
|
%% @doc UDP Server Include file.
|
||||||
|
|
||||||
|
%% Copyright 2008 Masahito Ikuta
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
|
||||||
|
%% @type udp_server_option() =
|
||||||
|
%% {option(), port(), max_restarts(), time(), shutdown(),
|
||||||
|
%% recv_length(), recv_timeout()}.
|
||||||
|
%% A data structure holding the options.
|
||||||
|
%% @type option() = [term()].
|
||||||
|
%% @type port() = integer().
|
||||||
|
%% @type max_restarts() = integer().
|
||||||
|
%% @type time() = integer().
|
||||||
|
%% @type shutdown() = integer().
|
||||||
|
%% @type recv_length() = integer().
|
||||||
|
%% @type recv_timeout() = integer() | infinity.
|
||||||
|
-record(udp_server_option, {
|
||||||
|
option = [binary],
|
||||||
|
port = 4000,
|
||||||
|
max_restarts = 3,
|
||||||
|
time = 60,
|
||||||
|
shutdown = 2000,
|
||||||
|
recv_length = 0,
|
||||||
|
recv_timeout = infinity
|
||||||
|
}).
|
||||||
|
|
Loading…
Reference in New Issue