diff options
author | Dan Gudmundsson <[email protected]> | 2016-02-12 08:43:05 +0100 |
---|---|---|
committer | Dan Gudmundsson <[email protected]> | 2016-02-12 08:43:05 +0100 |
commit | cf99bf2de73be06e0f0d597dc72e3d7df1ed5f90 (patch) | |
tree | c276d6c6dc576d89785991ace2f06ab060dbf901 /lib/mnesia/src/mnesia_locker.erl | |
parent | d7b8fad1dcd08c1a9a94952f45bd63dc39159be2 (diff) | |
parent | e84414ce53c7a1131c2356e81b5417badb1389c8 (diff) | |
download | otp-cf99bf2de73be06e0f0d597dc72e3d7df1ed5f90.tar.gz otp-cf99bf2de73be06e0f0d597dc72e3d7df1ed5f90.tar.bz2 otp-cf99bf2de73be06e0f0d597dc72e3d7df1ed5f90.zip |
Merge branch 'maint'
* maint:
mnesia: let loader check if tablelock is needed
mnesia: Avoid deadlock possibility in mnesia:del_table_copy schema
Diffstat (limited to 'lib/mnesia/src/mnesia_locker.erl')
-rw-r--r-- | lib/mnesia/src/mnesia_locker.erl | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/mnesia/src/mnesia_locker.erl b/lib/mnesia/src/mnesia_locker.erl index 89feeba2c3..5766f22e92 100644 --- a/lib/mnesia/src/mnesia_locker.erl +++ b/lib/mnesia/src/mnesia_locker.erl @@ -22,7 +22,7 @@ -module(mnesia_locker). -export([ - get_held_locks/0, + get_held_locks/0, get_held_locks/1, get_lock_queue/0, global_lock/5, ixrlock/5, @@ -236,6 +236,11 @@ loop(State) -> From ! {Ref, ok}, loop(State); + {From, {is_locked, Oid}} -> + Held = ?ets_lookup(mnesia_held_locks, Oid), + reply(From, Held), + loop(State); + {'EXIT', Pid, _} when Pid == State#state.supervisor -> do_stop(); @@ -1151,6 +1156,19 @@ get_held_locks() -> Locks = receive {mnesia_held_locks, Ls} -> Ls after 5000 -> [] end, rewrite_locks(Locks, []). +%% Mnesia internal usage only +get_held_locks(Tab) when is_atom(Tab) -> + Oid = {Tab, ?ALL}, + ?MODULE ! {self(), {is_locked, Oid}}, + receive + {?MODULE, _Node, Locks} -> + case Locks of + [] -> []; + [{Oid, _Prev, What}] -> What + end + end. + + rewrite_locks([{Oid, _, Ls}|Locks], Acc0) -> Acc = rewrite_locks(Ls, Oid, Acc0), rewrite_locks(Locks, Acc); |