From 08fecb93995728ab53d78beefc329331d79f303f Mon Sep 17 00:00:00 2001 From: Nathan Lasseter Date: Fri, 30 May 2014 13:34:17 +0100 Subject: Added directory structure and Makefile --- .gitignore | 1 + Makefile | 19 +++++++++++++++++++ eco_pool.erl | 42 ------------------------------------------ eco_proc.erl | 26 -------------------------- eco_tb.erl | 8 -------- eco_time.erl | 30 ------------------------------ eco_watcher.erl | 12 ------------ src/eco_pool.erl | 42 ++++++++++++++++++++++++++++++++++++++++++ src/eco_proc.erl | 26 ++++++++++++++++++++++++++ src/eco_tb.erl | 12 ++++++++++++ src/eco_time.erl | 30 ++++++++++++++++++++++++++++++ src/eco_watcher.erl | 16 ++++++++++++++++ 12 files changed, 146 insertions(+), 118 deletions(-) create mode 100644 Makefile delete mode 100644 eco_pool.erl delete mode 100644 eco_proc.erl delete mode 100644 eco_tb.erl delete mode 100644 eco_time.erl delete mode 100644 eco_watcher.erl create mode 100644 src/eco_pool.erl create mode 100644 src/eco_proc.erl create mode 100644 src/eco_tb.erl create mode 100644 src/eco_time.erl create mode 100644 src/eco_watcher.erl diff --git a/.gitignore b/.gitignore index 17278c0..002acbd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.beam +erl_crash.dump diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2dfb4cc --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +MODULES=eco_pool eco_proc eco_time eco_watcher eco_tb + +PREREQS=$(addprefix bin/, $(addsuffix .beam, ${MODULES})) + +.PHONY: all run clean + +all: bin/ ${PREREQS} + +run: bin/ ${PREREQS} + erl -pz bin/ -noshell -run eco_tb start + +clean: + rm -r bin erl_crash.dump + +bin/: + mkdir bin + +bin/%.beam: src/%.erl + erlc -o bin/ $< diff --git a/eco_pool.erl b/eco_pool.erl deleted file mode 100644 index 63fbc3d..0000000 --- a/eco_pool.erl +++ /dev/null @@ -1,42 +0,0 @@ --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 deleted file mode 100644 index c179a26..0000000 --- a/eco_proc.erl +++ /dev/null @@ -1,26 +0,0 @@ --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 deleted file mode 100644 index c13bb5d..0000000 --- a/eco_tb.erl +++ /dev/null @@ -1,8 +0,0 @@ --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 deleted file mode 100644 index 587cca5..0000000 --- a/eco_time.erl +++ /dev/null @@ -1,30 +0,0 @@ --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 deleted file mode 100644 index f2b6e25..0000000 --- a/eco_watcher.erl +++ /dev/null @@ -1,12 +0,0 @@ --module(eco_watcher). --export([watcher/0]). - -watcher() -> - receive - {From, stop} -> - From ! {ok, stopped}, - {ok, stopped}; - Msg -> - io:format("~p~n", [Msg]), - watcher() - end. diff --git a/src/eco_pool.erl b/src/eco_pool.erl new file mode 100644 index 0000000..63fbc3d --- /dev/null +++ b/src/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/src/eco_proc.erl b/src/eco_proc.erl new file mode 100644 index 0000000..c179a26 --- /dev/null +++ b/src/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/src/eco_tb.erl b/src/eco_tb.erl new file mode 100644 index 0000000..82119f6 --- /dev/null +++ b/src/eco_tb.erl @@ -0,0 +1,12 @@ +-module(eco_tb). +-export([start/0]). + +start() -> + Watcher = spawn(eco_watcher, watcher, [self()]), + 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]), + receive + {error, notock, _, _} -> + init:stop() + end. diff --git a/src/eco_time.erl b/src/eco_time.erl new file mode 100644 index 0000000..587cca5 --- /dev/null +++ b/src/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/src/eco_watcher.erl b/src/eco_watcher.erl new file mode 100644 index 0000000..ce14ab4 --- /dev/null +++ b/src/eco_watcher.erl @@ -0,0 +1,16 @@ +-module(eco_watcher). +-export([watcher/1]). + +watcher(Super) -> + receive + {From, stop} -> + From ! {ok, stopped}, + {ok, stopped}; + {error, notock, A, B} -> + Super ! {error, notock, A, B}, + io:format("~p~n", [{error, notock, A, B}]), + watcher(Super); + Msg -> + io:format("~p~n", [Msg]), + watcher(Super) + end. -- cgit v1.2.1