You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2014/08/28 14:19:50 UTC

[4/4] ets-lru commit: updated refs/heads/master to e9a75fb

Allow direct access when using a registered process

The match_object API currently takes both atoms and pids.
This change allows the atom case to skip a synchronous call
to the gen_server state. The old path remains to allow pids
to continue to work through the old call path since it
can't easily infer the lru objects table name.

BugzId: 26105


Project: http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/commit/e9a75fb7
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/tree/e9a75fb7
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/diff/e9a75fb7

Branch: refs/heads/master
Commit: e9a75fb72400044a04a36441a920016dce4ff84c
Parents: 4af7633
Author: Brian Mitchell <br...@p2p.io>
Authored: Fri Dec 6 11:07:09 2013 -0500
Committer: Robert Newson <rn...@apache.org>
Committed: Mon Jul 28 17:21:49 2014 +0100

----------------------------------------------------------------------
 src/ets_lru.erl | 7 +++++++
 test/06-match.t | 7 +++++--
 2 files changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/blob/e9a75fb7/src/ets_lru.erl
----------------------------------------------------------------------
diff --git a/src/ets_lru.erl b/src/ets_lru.erl
index dbf3402..0c94e17 100644
--- a/src/ets_lru.erl
+++ b/src/ets_lru.erl
@@ -96,6 +96,13 @@ match(LRU, KeySpec, ValueSpec) ->
 %% capturing placeholders will be aliased between the key and value
 %% parts.
 -spec match_object(atom() | pid(), term(), term()) -> [any()].
+match_object(Name, KeySpec, ValueSpec) when is_atom(Name) ->
+    Pattern = #entry{key=KeySpec, val=ValueSpec, _='_'},
+    Entries = ets:match_object(obj_table(Name), Pattern),
+    lists:map(fun(#entry{key=Key,val=Val}) ->
+        gen_server:cast(Name, {accessed, Key}),
+        Val
+    end, Entries);
 match_object(LRU, KeySpec, ValueSpec) ->
     gen_server:call(LRU, {match_object, KeySpec, ValueSpec}).
 

http://git-wip-us.apache.org/repos/asf/couchdb-ets-lru/blob/e9a75fb7/test/06-match.t
----------------------------------------------------------------------
diff --git a/test/06-match.t b/test/06-match.t
index 907ae78..c409e8d 100644
--- a/test/06-match.t
+++ b/test/06-match.t
@@ -5,7 +5,7 @@
 main([]) ->
     code:add_pathz("test"),
     code:add_pathz("ebin"),
-    tutil:run(6, fun() -> test() end).
+    tutil:run(7, fun() -> test() end).
 
 test() ->
     ?WITH_LRU(test_match_zero_values),
@@ -35,7 +35,10 @@ test_match_zero_objects(LRU) ->
 
 test_match_one_object(LRU) ->
     ets_lru:insert(LRU, ans, 42),
-    etap:is(ets_lru:match_object(LRU, ans, '$1'), [42], "Single match_object").
+    ViaRegistered = ets_lru:match_object(test_lru, ans, '$1'),
+    etap:is(ViaRegistered, [42], "Single match_object (registered)"),
+    ViaPid = ets_lru:match_object(LRU, ans, '$1'),
+    etap:is(ViaPid, [42], "Single match_object (pid)").
 
 test_match_many_objects(LRU) ->
     ets_lru:insert(LRU, {color, blue}, a),