aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Lasseter <nathan@4574.co.uk>2014-05-30 08:05:19 +0100
committerNathan Lasseter <nathan@4574.co.uk>2014-05-30 08:05:19 +0100
commit59cee25c7f863e76bc82cd58b33f6f3b4e13770c (patch)
treecd238d062a4c58e4c174a322ac02e1bb7e942d69
Initial Commit
-rw-r--r--.gitignore1
-rw-r--r--README.textile1
-rw-r--r--eco_pool.erl42
-rw-r--r--eco_proc.erl26
-rw-r--r--eco_tb.erl8
-rw-r--r--eco_time.erl30
-rw-r--r--eco_watcher.erl12
7 files changed, 120 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..17278c0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*.beam
diff --git a/README.textile b/README.textile
new file mode 100644
index 0000000..b316661
--- /dev/null
+++ b/README.textile
@@ -0,0 +1 @@
+h1. Eco
diff --git a/eco_pool.erl b/eco_pool.erl
new file mode 100644
index 0000000..63fbc3d
--- /dev/null
+++ b/eco_pool.erl
@@ -0,0 +1,42 @@
+-module(eco_pool).
+-export([start_pool/1, start_random_pool/2]).
+
+start_pool(Data) ->
+ pool_loop(Data).
+
+start_random_pool(Size, Max) ->
+ random:seed(now()),
+ Data = [random:uniform(Max) || _ <- lists:seq(1, Size)],
+ pool_loop(Data).
+
+pool_loop(PoolData) ->
+ receive
+ {From, stop} ->
+ From ! {ok, stopped},
+ {ok, stopped};
+ {From, drain} ->
+ From ! {ok, drained},
+ pool_loop([]);
+ {From, set, Data} ->
+ From ! {ok, set, Data},
+ pool_loop(Data);
+ {From, put, Data} ->
+ From ! {ok, put, Data},
+ pool_loop(PoolData ++ Data);
+ {From, get, Data} ->
+ New = PoolData -- Data,
+ Test = PoolData -- New,
+ if
+ Test =:= Data ->
+ From ! {ok, get, Data},
+ pool_loop(New);
+ true ->
+ From ! {error, get, Data},
+ pool_loop(PoolData)
+ end;
+ {From, look} ->
+ From ! {ok, look, PoolData},
+ pool_loop(PoolData);
+ Msg ->
+ {error, invalid_message, Msg}
+ end.
diff --git a/eco_proc.erl b/eco_proc.erl
new file mode 100644
index 0000000..c179a26
--- /dev/null
+++ b/eco_proc.erl
@@ -0,0 +1,26 @@
+-module(eco_proc).
+-export([proc/6]).
+
+proc(Watcher, _, _, _, 0, _) ->
+ Watcher ! {died, self()};
+proc(Watcher, Gets, Puts, Pool, Life, MaxLife) ->
+ receive
+ {From, stop} ->
+ From ! {ok, stopped, self()},
+ Watcher ! {stopped, self()},
+ {ok, stopped};
+ {From, tick} ->
+ From ! {self(), tock},
+ Watcher ! {tick, self()},
+ Pool ! {self(), get, Gets},
+ receive
+ {ok, get, Gets} ->
+ Pool ! {self(), put, Puts},
+ receive
+ {ok, put, Puts} ->
+ proc(Watcher, Gets, Puts, Pool, MaxLife, MaxLife)
+ end;
+ {error, get, Gets} ->
+ proc(Watcher, Gets, Puts, Pool, Life - 1, MaxLife)
+ end
+ end.
diff --git a/eco_tb.erl b/eco_tb.erl
new file mode 100644
index 0000000..c13bb5d
--- /dev/null
+++ b/eco_tb.erl
@@ -0,0 +1,8 @@
+-module(eco_tb).
+-export([start/0]).
+
+start() ->
+ Watcher = spawn(eco_watcher, watcher, []),
+ Pool = spawn(eco_pool, start_pool, [[1,1,1]]),
+ Proc1 = spawn(eco_proc, proc, [Watcher, [1], [], Pool, 3, 3]),
+ _Ticker = spawn(eco_time, ticker, [Watcher, 1000, [Proc1], 3000]).
diff --git a/eco_time.erl b/eco_time.erl
new file mode 100644
index 0000000..587cca5
--- /dev/null
+++ b/eco_time.erl
@@ -0,0 +1,30 @@
+-module(eco_time).
+-export([ticker/4]).
+
+ticker(Watcher, Interval, ProcList, Timeout) ->
+ receive
+ {From, stop} ->
+ From ! {ok, stopped},
+ {ok, stopped}
+ after Interval ->
+ handle_tick(self(), ProcList, Timeout),
+ receive
+ {ok, endtick} ->
+ Watcher ! {endtick, self()},
+ ticker(Watcher, Interval, ProcList, Timeout);
+ {error, notock, Proc} ->
+ Watcher ! {error, notock, Proc, self()},
+ {error, notock, Proc}
+ end
+ end.
+
+handle_tick(Ticker, [], _) ->
+ Ticker ! {ok, endtick};
+handle_tick(Ticker, [This | Next], Timeout) ->
+ This ! {self(), tick},
+ receive
+ {This, tock} ->
+ handle_tick(Ticker, Next, Timeout)
+ after Timeout ->
+ Ticker ! {error, notock, This}
+ end.
diff --git a/eco_watcher.erl b/eco_watcher.erl
new file mode 100644
index 0000000..f2b6e25
--- /dev/null
+++ b/eco_watcher.erl
@@ -0,0 +1,12 @@
+-module(eco_watcher).
+-export([watcher/0]).
+
+watcher() ->
+ receive
+ {From, stop} ->
+ From ! {ok, stopped},
+ {ok, stopped};
+ Msg ->
+ io:format("~p~n", [Msg]),
+ watcher()
+ end.