Skip to content

Instantly share code, notes, and snippets.

@onlyshk
Created November 29, 2010 07:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save onlyshk/719677 to your computer and use it in GitHub Desktop.
Save onlyshk/719677 to your computer and use it in GitHub Desktop.
client server erl
-module(f).
-export([init/0]).
-export([start/0, get_freq/0, stop/0]).
-export([allocate/0, deallocate/1]).
%%
%% server functions
%%
start()->
register(f, spawn(f, init, [])).
init() ->
Freq = {get_freq(), []},
loop(Freq).
get_freq()->
[10,11,12,13,14,15].
%
% client functions
%
stop() -> call(stop).
allocate() -> call(allocate).
deallocate(Freq) -> call({deallocate, Freq}).
call( Message ) ->
f ! { request, self(), Message },
receive
{reply, Reply} ->
Reply
end.
%
% The main loop
%
loop(Frequencies) ->
receive
{request, Pid, allocate} ->
{NewFreq, Reply} = allocate(Frequencies, Pid),
reply(Pid, Reply),
loop(NewFreq);
{request, Pid, {deallocate, Freq}} ->
NewFreq = deallocate(Frequencies, Freq),
reply(Pid, ok),
loop(NewFreq);
{request, Pid, stop} ->
reply(Pid, ok)
end.
reply(Pid, Reply) ->
Pid ! Reply.
%
% allocate & deallocate
%
allocate({[], Allocated}, _Pid)->
{{[], Allocated}, {error, no_freqquency}};
allocate({[Freq | Free], Allocated}, Pid) ->
{{Free, [{Freq , Pid} | Allocated]}, {ok, Freq}}.
deallocate({Free, Allocated}, Freq) ->
NewAlloc = lists:keydelete(Freq, 1, Allocated),
{[Freq | Free], NewAlloc}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment