| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/io')
| -rw-r--r-- | src/io/database_shim.erl | 6 | ||||
| -rw-r--r-- | src/io/timed_cache.erl | 39 | ||||
| -rw-r--r-- | src/io/timed_caches_manager.erl | 71 | 
3 files changed, 67 insertions, 49 deletions
| diff --git a/src/io/database_shim.erl b/src/io/database_shim.erl index 0b9ea1c..d55d848 100644 --- a/src/io/database_shim.erl +++ b/src/io/database_shim.erl @@ -12,7 +12,7 @@     [        generate_db/1,        fetch/2, -      commit/3, +      commit/4,        assert_session_is_valid/2     ]  ). @@ -98,9 +98,9 @@ fetch (DB, ObjectID) ->        [] -> nothing     end. -commit (DB, ObjectID, Value) -> +commit (DB, Owner, ObjectID, Value) ->     add_to_db({DB, ObjectID}, Value), -   timed_cache:invalidate(DB, ObjectID). +   timed_cache:invalidate(DB, Owner, ObjectID).  assert_session_is_valid (_PlayerID, _SessionToken) ->     % Ask PlayerID's login server if SessionToken is correct. diff --git a/src/io/timed_cache.erl b/src/io/timed_cache.erl index 1b750b0..ec58caa 100644 --- a/src/io/timed_cache.erl +++ b/src/io/timed_cache.erl @@ -26,18 +26,18 @@  -export  (     [ -      fetch/2, -      invalidate/2 +      fetch/3, +      invalidate/3     ]  ).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -add_to_cache (DB, ObjectID) -> -   {ok, TimerPID} = gen_server:start(?MODULE, {DB, ObjectID}, []), +add_to_cache (DB, Owner, ObjectID) -> +   {ok, TimerPID} = gen_server:start(?MODULE, {DB, {Owner, ObjectID}}, []),     {ok, Data} = database_shim:fetch(DB, ObjectID), -   ets:insert(DB, {ObjectID, TimerPID, Data}), +   ets:insert(DB, {{Owner, ObjectID}, TimerPID, Data}),     Data.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -48,13 +48,21 @@ init ({DB, ObjectID}) ->     {ok, {DB, ObjectID}}.  handle_call (invalidate, _, State) -> -   {stop, normal, State}. +   {stop, normal, State}; +handle_call (ping, _, State) -> +   {noreply, State, timed_caches_manager:get_timeout()}.  handle_cast (invalidate, State) -> -   {stop, normal, State}. +   {stop, normal, State}; +handle_cast (ping, State) -> +   {noreply, State, timed_caches_manager:get_timeout()}.  terminate (_, {DB, ObjectID}) -> -   io:format("~nCache entry timed out: ~p.~n", [{DB, ObjectID}]), +   io:format +   ( +      "~nCache entry timed out or was invalidated: ~p.~n", +      [{DB, ObjectID}] +   ),     ets:delete(DB, ObjectID).  code_change (_, State, _) -> @@ -66,20 +74,21 @@ format_status (_, [_, State]) ->  handle_info(timeout, State) ->     {stop, normal, State};  handle_info(_, {DB, ObjectID}) -> -   {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout(DB)}. +   {noreply, {DB, ObjectID}, timed_caches_manager:get_timeout()}.  %%%% Interface Functions -fetch (DB, ObjectID) -> -   io:format("~nfetch from cache: ~p.~n", [{DB, ObjectID}]), -   case ets:lookup(DB, ObjectID) of -      [] -> add_to_cache(DB, ObjectID); +fetch (DB, Owner, ObjectID) -> +   io:format("~nfetch from cache: ~p.~n", [{DB, {Owner, ObjectID}}]), +   case ets:lookup(DB, {Owner, ObjectID}) of +      [] -> add_to_cache(DB, Owner, ObjectID);        [{_, TimerPID, Data}] -> +         gen_server:cast(TimerPID, ping),           Data     end. -invalidate (DB, ObjectID) -> -   case ets:lookup(DB, ObjectID) of +invalidate (DB, Owner, ObjectID) -> +   case ets:lookup(DB, {Owner, ObjectID}) of        [] -> ok;        [{_, TimerPID, _}] -> diff --git a/src/io/timed_caches_manager.erl b/src/io/timed_caches_manager.erl index 21f2b6b..5901964 100644 --- a/src/io/timed_caches_manager.erl +++ b/src/io/timed_caches_manager.erl @@ -24,17 +24,17 @@  %%%% Actual Interface  -export(     [ -      add_cache/3, -      inherit_cache/3, +      start/0, +      new_cache/3,        delete_cache/2, -      get_timeout/1 +      get_timeout/0     ]  )  .  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -delete_cache (DB) -> +remove_cache (DB) ->     ets:delete(DB).  add_cache (DB, none) -> @@ -74,6 +74,29 @@ inherit_cache (CacheList, DB, Heir) ->           [DB|CacheList]     end. +remove_cache (CacheList, DB) -> +   case lists:member(DB, CacheList) of +      true -> +         remove_cache(DB), +         lists:delete(DB, CacheList); +      false -> +         CacheList +   end. + +add_cache (CacheList, DB, Heir) -> +   case lists:member(DB, CacheList) of +      true when (Heir =:= none) -> +         CacheList; + +      true -> +         ets:setopts(DB, {heir, Heir, DB}), +         CacheList; + +      false -> +         add_cache(DB, Heir), +         [DB|CacheList] +   end. +  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -82,8 +105,8 @@ init (CacheList) ->     io:format("~nStarting Timed Caches Manager..."),     {ok, CacheList}. -handle_call ({delete, CacheName}, _Caller, State) -> -   {noreply, delete_cache(State, CacheName)}; +handle_call ({remove, CacheName}, _Caller, State) -> +   {noreply, remove_cache(State, CacheName)};  handle_call ({add, CacheName, Heir}, _Caller, State)->     {noreply, add_cache(State, CacheName, Heir)};  handle_call ({inherit, CacheName, Heir}, _Caller, State)-> @@ -91,8 +114,8 @@ handle_call ({inherit, CacheName, Heir}, _Caller, State)->  handle_call (terminate, _, State) ->     {stop, normal, State}. -handle_cast ({delete, CacheName}, State) -> -   {noreply, delete_cache(State, CacheName)}; +handle_cast ({remove, CacheName}, State) -> +   {noreply, remove_cache(State, CacheName)};  handle_cast ({add, CacheName, Heir}, State)->     {noreply, add_cache(State, CacheName, Heir)};  handle_cast ({inherit, CacheName, Heir}, State)-> @@ -103,7 +126,7 @@ handle_cast (terminate, State) ->  terminate (_Reason, []) ->     ok;  terminate (Reason, [CacheName|OtherCaches]) -> -   delete_cache(CacheName), +   remove_cache(CacheName),     terminate(Reason, OtherCaches).  code_change (_, State, _) -> @@ -116,28 +139,14 @@ handle_info(_, State) ->     {noreply, State}.  %%%% Interface Functions -delete_cache (CacheList, DB) -> -   case lists:member(DB, CacheList) of -      true -> -         delete_cache(DB), -         lists:delete(DB, CacheList); -      false -> -         CacheList -   end. +start () -> +   gen_server:start(timed_caches_manager, [], []). -add_cache (CacheList, DB, Heir) -> -   case lists:member(DB, CacheList) of -      true when (Heir =:= none) -> -         CacheList; - -      true -> -         ets:setopts(DB, {heir, Heir, DB}), -         CacheList; +new_cache (ManagerPid, DB, Heir) -> +   gen_server:cast(ManagerPid, {add, DB, Heir}). -      false -> -         add_cache(DB, Heir), -         [DB|CacheList] -   end. +delete_cache (ManagerPid, DB) -> +   gen_server:cast(ManagerPid, {remove, DB}). -get_timeout(_) -> -   300000. % 5min. +get_timeout () -> +   120000. % 2min. | 


