File 2456-mnesia-simplify-select_reverse-1.patch of Package erlang

From 47ee9cdba33c023599fc2efe07eab665bd666c82 Mon Sep 17 00:00:00 2001
From: Bentheburrito <github.arson718@passmail.net>
Date: Mon, 5 May 2025 19:17:48 -0700
Subject: [PATCH 6/8] mnesia: simplify select_reverse/1

---
 lib/mnesia/src/mnesia.erl     | 44 ++++++++++++-----------------------
 lib/mnesia/src/mnesia_lib.erl | 11 ---------
 2 files changed, 15 insertions(+), 40 deletions(-)

diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index dbea874b69..a87c7a7ccb 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -2604,44 +2604,32 @@ Notice that any modifying operations, that is, `mnesia:write` or
       Match::term(),
       Cont::select_continuation().
 select_reverse(Cont) ->
-    case get(mnesia_activity_state) of
-	{?DEFAULT_ACCESS, Tid, Ts} ->
-	    select_cont(Tid,Ts,Cont,reverse);
-	{Mod, Tid, Ts} ->
-	    Mod:select_cont(Tid,Ts,Cont,reverse);
-	_ ->
-	    abort(no_transaction)
-    end.
+    select(Cont).
 
 -doc false.
-select_cont(Tid,Ts,State) ->
-    select_cont(Tid,Ts,State,forward).
-select_cont(_Tid,_Ts,'$end_of_table',_Dir) ->
+select_cont(_Tid,_Ts,'$end_of_table') ->
     '$end_of_table';
-select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid,cont=Cont, orig=Ms},Dir)
+select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid,cont=Cont, orig=Ms})
   when element(1,Tid) == ets ->
     case Cont of
 	'$end_of_table' -> '$end_of_table';
 	_ ->
-	    Result = case Dir of
-	        forward -> mnesia_lib:db_select_cont(ram_copies,Cont,Ms);
-	        reverse -> mnesia_lib:db_select_rev_cont(ram_copies,Cont,Ms)
-	    end,
+	    Result = mnesia_lib:db_select_cont(ram_copies,Cont,Ms),
 	    select_state(Result,State)
     end;
-select_cont(Tid,_,State=#mnesia_select{tid=Tid,written=[]},Dir) ->
-    select_state(dirty_sel_cont(State,Dir),State);
-select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid},Dir)  ->
-    trans_select(dirty_sel_cont(State,Dir), State);
-select_cont(Tid2,_,#mnesia_select{tid=_Tid1},_Dir)
+select_cont(Tid,_,State=#mnesia_select{tid=Tid,written=[]}) ->
+    select_state(dirty_sel_cont(State),State);
+select_cont(Tid,_Ts,State=#mnesia_select{tid=Tid}) ->
+    trans_select(dirty_sel_cont(State), State);
+select_cont(Tid2,_,#mnesia_select{tid=_Tid1})
   when element(1,Tid2) == tid ->  % Mismatching tids
     abort(wrong_transaction);
-select_cont(Tid,Ts,State=#mnesia_select{},Dir) ->
+select_cont(Tid,Ts,State=#mnesia_select{}) ->
     % Repair mismatching tids in non-transactional contexts
     RepairedState = State#mnesia_select{tid = Tid, written = [],
                                         spec = undefined, type = undefined},
-    select_cont(Tid,Ts,RepairedState,Dir);
-select_cont(_,_,Cont,_Dir) ->
+    select_cont(Tid,Ts,RepairedState);
+select_cont(_,_,Cont) ->
     abort({badarg, Cont}).
 
 trans_select('$end_of_table', #mnesia_select{written=Written0,spec=CMS,type=Type}) ->
@@ -3117,11 +3105,9 @@ dirty_sel_init(Node,Tab,Spec,NObjects,Type,forward) ->
 dirty_sel_init(Node,Tab,Spec,NObjects,Type,reverse) ->
     do_dirty_rpc(Tab,Node,mnesia_lib,db_select_rev_init,[Type,Tab,Spec,NObjects]).
 
-dirty_sel_cont(#mnesia_select{cont='$end_of_table'},_Dir) -> '$end_of_table';
-dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms},forward) ->
-    do_dirty_rpc(Tab,Node,mnesia_lib,db_select_cont,[Type,Cont,Ms]);
-dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms},reverse) ->
-    do_dirty_rpc(Tab,Node,mnesia_lib,db_select_rev_cont,[Type,Cont,Ms]).
+dirty_sel_cont(#mnesia_select{cont='$end_of_table'}) -> '$end_of_table';
+dirty_sel_cont(#mnesia_select{node=Node,tab=Tab,storage=Type,cont=Cont,orig=Ms}) ->
+    do_dirty_rpc(Tab,Node,mnesia_lib,db_select_cont,[Type,Cont,Ms]).
 
 -doc """
 Dirty equivalent to `mnesia:all_keys/1`.
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 9354eb1b1f..53ccf26575 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -80,7 +80,6 @@
 	 db_select_init/4,
 	 db_select_rev_init/4,
 	 db_select_cont/3,
-	 db_select_rev_cont/3,
 	 db_slot/2,
 	 db_slot/3,
 	 db_update_counter/3,
@@ -1250,16 +1249,6 @@ db_select_rev_init(disc_only_copies, Tab, Pat, Limit) ->
 db_select_rev_init(_, Tab, Pat, Limit) ->
     ets:select_reverse(Tab, Pat, Limit).
 
-db_select_rev_cont({ext, _Alias, Mod}, Cont0, Ms) ->
-    Cont = Mod:repair_continuation(Cont0, Ms),
-    Mod:select_reverse(Cont);
-db_select_rev_cont(disc_only_copies, Cont0, Ms) ->
-    Cont = dets:repair_continuation(Cont0, Ms),
-    dets:select(Cont);
-db_select_rev_cont(_, Cont0, Ms) ->
-    Cont = ets:repair_continuation(Cont0, Ms),
-    ets:select_reverse(Cont).
-
 db_erase(Tab, Key) ->
     db_erase(val({Tab, storage_type}), Tab, Key).
 db_erase(ram_copies, Tab, Key) -> ?ets_delete(Tab, Key), ok;
-- 
2.43.0

openSUSE Build Service is sponsored by