From 59cee25c7f863e76bc82cd58b33f6f3b4e13770c Mon Sep 17 00:00:00 2001 From: Nathan Lasseter Date: Fri, 30 May 2014 08:05:19 +0100 Subject: Initial Commit --- .gitignore | 1 + README.textile | 1 + eco_pool.erl | 42 ++++++++++++++++++++++++++++++++++++++++++ eco_proc.erl | 26 ++++++++++++++++++++++++++ eco_tb.erl | 8 ++++++++ eco_time.erl | 30 ++++++++++++++++++++++++++++++ eco_watcher.erl | 12 ++++++++++++ 7 files changed, 120 insertions(+) create mode 100644 .gitignore create mode 100644 README.textile create mode 100644 eco_pool.erl create mode 100644 eco_proc.erl create mode 100644 eco_tb.erl create mode 100644 eco_time.erl create mode 100644 eco_watcher.erl 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. -- cgit v1.2.1