aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mnesia/src/mnesia_locker.erl
diff options
context:
space:
mode:
authorDan Gudmundsson <[email protected]>2016-02-12 08:42:06 +0100
committerDan Gudmundsson <[email protected]>2016-02-12 08:42:06 +0100
commite84414ce53c7a1131c2356e81b5417badb1389c8 (patch)
tree545c56466a350d6e11be9ed5da923b9f58ff05b6 /lib/mnesia/src/mnesia_locker.erl
parent5c023eaea4b35d1f2b2ccf7809bfeb9bc6384077 (diff)
parentc1f4d4a6d5c189f7cd4b3b073fb47f8dfb8d3fff (diff)
downloadotp-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.erl20
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);