aboutsummaryrefslogtreecommitdiff
path: root/erlbal_p.erl
diff options
context:
space:
mode:
authorNathan Lasseter <nathan.je.lasseter@googlemail.com>2011-12-23 10:11:48 +0000
committerNathan Lasseter <nathan.je.lasseter@googlemail.com>2011-12-23 10:11:48 +0000
commitb5c22a8a96203ad6b656524fe5ecf246a89efb58 (patch)
treebf098b067149c41fa3a8f46063909927b904fe46 /erlbal_p.erl
parent2db1bbcde1e0e643a85619a1be350225264d3c10 (diff)
Started work on erlbal_n. Changed names to reflect.erlbal-n
Diffstat (limited to 'erlbal_p.erl')
-rw-r--r--erlbal_p.erl59
1 files changed, 59 insertions, 0 deletions
diff --git a/erlbal_p.erl b/erlbal_p.erl
new file mode 100644
index 0000000..ed43e0e
--- /dev/null
+++ b/erlbal_p.erl
@@ -0,0 +1,59 @@
+-module(erlbal_p).
+-export([make_request/2, start_bal/0, stop_bal/1, start_server/4, stop_server/2, list_servers/1]).
+
+start_server(Balancer, Node, Fun, INITSTATE) when is_function(Fun, 2) andalso is_list(INITSTATE) ->
+ PID = spawn(Node, fun() -> server_loop(Fun, INITSTATE) end),
+ Balancer ! {add_node, PID}.
+
+stop_server(Balancer, PID) ->
+ Balancer ! {del_node, PID},
+ PID ! die.
+
+list_servers(Balancer) ->
+ Balancer ! {list_nodes, self()},
+ receive Nodes -> Nodes end.
+
+server_loop(Fun, STATE) ->
+ receive
+ {request, From, ARGS} ->
+ {Ret, NEWSTATE} = Fun(ARGS, STATE),
+ From ! Ret,
+ server_loop(Fun, NEWSTATE);
+ die ->
+ ok
+ end.
+
+start_bal() ->
+ spawn(fun() -> bal_loop([], 1) end).
+
+stop_bal(Balancer) ->
+ Balancer ! die.
+
+bal_loop(Serverlist, Nextserver) ->
+ receive
+ {add_node, PID} ->
+ bal_loop(Serverlist ++ [PID], Nextserver);
+ {del_node, PID} ->
+ bal_loop(Serverlist -- [PID], Nextserver);
+ {list_nodes, From} ->
+ From ! Serverlist,
+ bal_loop(Serverlist, Nextserver);
+ {request, From, ARGS} ->
+ Serv = lists:nth(Nextserver, Serverlist),
+ Serv ! {request, From, ARGS},
+ NS = Nextserver + 1,
+ SLL = length(Serverlist),
+ if
+ NS > SLL ->
+ bal_loop(Serverlist, 1);
+ true ->
+ bal_loop(Serverlist, NS)
+ end;
+ die ->
+ ok
+ end.
+
+
+make_request(Balancer, ARGS) when is_list(ARGS)->
+ Balancer ! {request, self(), ARGS},
+ receive Ret -> Ret end.