From e9072b356cc917cacbffabc5086eb7d880ec5bb2 Mon Sep 17 00:00:00 2001 From: Dan Gudmundsson Date: Thu, 12 Jan 2012 11:54:09 +0100 Subject: [Mnesia] More optimizations If a transaction releases a write, it can be deleted directly since no read locks or other write locks can be present --- lib/mnesia/src/mnesia_locker.erl | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/mnesia/src/mnesia_locker.erl b/lib/mnesia/src/mnesia_locker.erl index a9eb27dea2..a22c95d454 100644 --- a/lib/mnesia/src/mnesia_locker.erl +++ b/lib/mnesia/src/mnesia_locker.erl @@ -531,23 +531,16 @@ release_locks([]) -> release_lock({Tid, Oid, {queued, _}}) -> ?ets_match_delete(mnesia_lock_queue, #queue{oid=Oid, tid = Tid, op = '_', pid = '_', lucky = '_'}); -release_lock({Tid, Oid, Op}) -> +release_lock({_Tid, Oid, write}) -> + ?ets_delete(mnesia_held_locks, Oid); +release_lock({Tid, Oid, read}) -> case ?ets_lookup(mnesia_held_locks, Oid) of - [] -> ok; [{Oid, Prev, Locks0}] -> - Locks = remove_tid(Locks0, Tid, []), - if Locks =:= [] -> - ?ets_delete(mnesia_held_locks, Oid); - Op =:= read -> - ?ets_insert(mnesia_held_locks, {Oid, Prev, Locks}); - true -> - case lists:any(fun({TOp, _}) -> TOp =:= write end, Locks) of - true -> - ?ets_insert(mnesia_held_locks, {Oid, write, Locks}); - false -> - ?ets_insert(mnesia_held_locks, {Oid, read, Locks}) - end - end + case remove_tid(Locks0, Tid, []) of + [] -> ?ets_delete(mnesia_held_locks, Oid); + Locks -> ?ets_insert(mnesia_held_locks, {Oid, Prev, Locks}) + end; + [] -> ok end. remove_tid([{_Op, Tid}|Ls], Tid, Acc) -> -- cgit v1.2.3