| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2017-11-08 16:47:17 +0100 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2017-11-08 16:47:17 +0100 | 
| commit | 40d1bb3db6651f65417ce5cd1c85f176afe92eb4 (patch) | |
| tree | 3944ddc4646476ccf696f1a72fd2dc73a1a86699 | |
| parent | dd51a1d2b2d05192b3d3022f3065b9d2d9f561c1 (diff) | |
Turns the caches manager into a gen_server.
| -rw-r--r-- | src/timed_cache_manager.erl | 76 | ||||
| -rw-r--r-- | src/timed_caches_manager.erl | 115 | 
2 files changed, 115 insertions, 76 deletions
| diff --git a/src/timed_cache_manager.erl b/src/timed_cache_manager.erl deleted file mode 100644 index 45b013c..0000000 --- a/src/timed_cache_manager.erl +++ /dev/null @@ -1,76 +0,0 @@ --module(timed_cache_manager). --export( -   [ -      new/2, -      start/1, -      fetch/2 -   ] -). -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% Manager %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -manager_core_loop (DB) -> -   receive -      terminate -> ets:delete(DB) -   end. - -new_database (DB) -> -   ets:new( -      DB, -      [ -         set, -         public, -         {keypos, 1}, -         {read_concurrency, true} -      ] -   ). - -%%%% Timer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -timer_cleanup (DB, ObjectID) -> -   ets:delete(DB, ObjectID). - -timer_core_loop (DB, ObjectID, Timeout) -> -   receive -      ok -> timer_core_loop(DB, ObjectID, Timeout); -      terminate -> ok -   after Timeout -> -      timer_cleanup(DB, ObjectID) -   end. - -add_timer (DB, ObjectID, Timeout) -> -   spawn(timed_cache_manager, timer_core_loop, [DB, ObjectID, Timeout]). - -add_to_cache (DB, ObjectID) -> -   TimerPID = add_timer(DB, ObjectID, 60000), -   Data = nothing, %% Do the actual NoSQL Fetch here. -   ets:insert(DB, {ObjectID, TimerPID, Data}), -   Data. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -new (Manager, DB) -> -   register( -      Manager, -      spawn( -         timed_cache_manager, -         start, -         [DB] -      ) -   ). - -start (DB) -> -   new_database(DB), -   manager_core_loop(DB). - -fetch (DB, ObjectID) -> -   case ets:lookup(DB, ObjectID) of -      [] -> -         add_to_cache(DB, ObjectID); - -      [{_, TimerPID, Data}] -> -         TimerPID ! ok, -         Data -   end. diff --git a/src/timed_caches_manager.erl b/src/timed_caches_manager.erl new file mode 100644 index 0000000..a2c95f3 --- /dev/null +++ b/src/timed_caches_manager.erl @@ -0,0 +1,115 @@ +-module(timed_caches_manager). +-behavior(gen_server). + +%%%% gen_server exports +-export( +   [ +      init/1, +      handle_cast/2, +      handle_call/3, +      terminate/2, +      code_change/3, +      format_status/2, +      handle_info/2 +   ] +). + +%%%% actual interface +-export( +   [ +      add_cache/3, +      inherit_cache/3, +      delete_cache/2 +   ] +) +. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%% Manager %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +delete_cache (DB) -> +   ets:delete(DB). + +add_cache (DB, Heir) -> +   ets:new( +      DB, +      [ +         set, +         public, +         {keypos, 1}, +         {read_concurrency, true}, +         {heir, Heir, DB} +      ] +   ). + +delete_cache (CacheList, DB) -> +   case lists:member(DB, CacheList) of +      true -> +         delete_cache(DB), +         lists:delete(DB, CacheList); +      false -> +         CacheList +   end. + +add_cache (CacheList, DB, Heir) -> +   case lists:member(DB, CacheList) of +      true -> +         ets:setopts(DB, {heir, Heir, DB}), +         CacheList; + +      false -> +         add_cache(DB, Heir), +         [DB|CacheList] +   end. + +inherit_cache (CacheList, DB, Heir) -> +   case lists:member(DB, CacheList) of +      true -> +         ets:setopts(DB, {heir, Heir, DB}), +         CacheList; + +      false -> +         [DB|CacheList] +   end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% gen_server +init (CacheList) -> +   {ok,CacheList}. + +handle_call ({delete, CacheName}, _Caller, State) -> +   {noreply, delete_cache(State, CacheName)}; +handle_call ({add, CacheName, Heir}, _Caller, State)-> +   {noreply, add_cache(State, CacheName, Heir)}; +handle_call ({inherit, CacheName, Heir}, _Caller, State)-> +   {noreply, inherit_cache(State, CacheName, Heir)}; +handle_call (terminate, _, State) -> +   {stop, normal, State}. + +handle_cast ({delete, CacheName}, State) -> +   {noreply, delete_cache(State, CacheName)}; +handle_cast ({add, CacheName, Heir}, State)-> +   {noreply, add_cache(State, CacheName, Heir)}; +handle_cast ({inherit, CacheName, Heir}, State)-> +   {noreply, inherit_cache(State, CacheName, Heir)}; +handle_cast (terminate, State) -> +   {stop, normal, State}. + +terminate (_Reason, []) -> +   ok; +terminate (Reason, [CacheName|OtherCaches]) -> +   delete_cache(CacheName), +   terminate(Reason, OtherCaches). + +code_change (_, State, _) -> +   {ok, State}. + +format_status (_, [_, State]) -> +   [{data, [{"State", State}]}]. + +handle_info(_, State) -> +   {noreply, State}. | 


