diff options
author | Dan Gudmundsson <[email protected]> | 2016-02-12 08:42:06 +0100 |
---|---|---|
committer | Dan Gudmundsson <[email protected]> | 2016-02-12 08:42:06 +0100 |
commit | e84414ce53c7a1131c2356e81b5417badb1389c8 (patch) | |
tree | 545c56466a350d6e11be9ed5da923b9f58ff05b6 /lib/mnesia/src/mnesia_locker.erl | |
parent | 5c023eaea4b35d1f2b2ccf7809bfeb9bc6384077 (diff) | |
parent | c1f4d4a6d5c189f7cd4b3b073fb47f8dfb8d3fff (diff) | |
download | otp-e84414ce53c7a1131c2356e81b5417badb1389c8.tar.gz otp-e84414ce53c7a1131c2356e81b5417badb1389c8.tar.bz2 otp-e84414ce53c7a1131c2356e81b5417badb1389c8.zip |
Merge branch 'dgud/mnesia/del_schema_hangs/OTP-13284' into maint
* dgud/mnesia/del_schema_hangs/OTP-13284:
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); |