File 0127-erts-Fix-some-racy-tests.patch of Package erlang

From ea0dc74351b55af92b4e0686d3fa9c92095833fe Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Fri, 15 Mar 2019 16:22:44 +0100
Subject: [PATCH] erts: Fix some racy tests

Wait for resource-holding processes to garbage collect before
exiting to know destructors have been called.
---
 erts/emulator/test/nif_SUITE.erl | 37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/erts/emulator/test/nif_SUITE.erl b/erts/emulator/test/nif_SUITE.erl
index 2309f844b9..62b7f77a52 100644
--- a/erts/emulator/test/nif_SUITE.erl
+++ b/erts/emulator/test/nif_SUITE.erl
@@ -1223,7 +1223,7 @@ maps(Config) when is_list(Config) ->
     repeat_while(fun({35,_}) -> false;
                     ({K,Map}) ->
                          Map = maps_from_list_nif(maps:to_list(Map)),
-                         Map = maps:filter(fun(K,V) -> V =:= K*100 end, Map),
+                         Map = maps:filter(fun(K2,V) -> V =:= K2*100 end, Map),
                          {K+1, maps:put(K,K*100,Map)}
                  end,
                  {1,#{}}),
@@ -1294,24 +1294,29 @@ resource_hugo_do(Type) ->
     release_resource(HugoPtr),
     erlang:garbage_collect(),
     {HugoPtr,HugoBin} = get_resource(Type,Hugo),
-    Pid = spawn_link(fun() -> 			     
-                             receive {Pid, Type, Resource, Ptr, Bin} ->
-                                         Pid ! {self(), got_it},
-                                         receive {Pid, check_it} ->
-                                                     {Ptr,Bin} = get_resource(Type,Resource),
-                                                     Pid ! {self(), ok}
-                                         end
-                             end
-                     end),
+    {Pid,_} =
+        spawn_monitor(fun() ->
+                              receive {Pid, Type, Resource, Ptr, Bin} ->
+                                      Pid ! {self(), got_it},
+                                      receive {Pid, check_it} ->
+                                              {Ptr,Bin} = get_resource(Type,Resource)
+                                      end
+                              end,
+                              gc_and_exit(ok)
+                      end),
     Pid ! {self(), Type, Hugo, HugoPtr, HugoBin},
     {Pid, got_it} = receive_any(),
     erlang:garbage_collect(),   % just to make our ProcBin move in memory
     Pid ! {self(), check_it},
-    {Pid, ok} = receive_any(),
+    {'DOWN', _, process, Pid, ok} = receive_any(),
     [] = last_resource_dtor_call(),
     {HugoPtr,HugoBin} = get_resource(Type,Hugo),
     {HugoPtr, HugoBin, 1}.
 
+gc_and_exit(Reason) ->
+    erlang:garbage_collect(),
+    exit(Reason).
+
 resource_otto(Type) ->
     {OttoPtr, OttoBin} = resource_otto_do(Type),
     erlang:garbage_collect(),
@@ -1388,14 +1393,14 @@ resource_binary_do() ->
     ResInfo = {Ptr,_} = get_resource(binary_resource_type,ResBin1),
 
     Papa = self(),
-    Forwarder = spawn_link(fun() -> forwarder(Papa) end),
+    {Forwarder,_} = spawn_monitor(fun() -> forwarder(Papa) end),
     io:format("sending to forwarder pid=~p\n",[Forwarder]),  
     Forwarder ! ResBin1,
     ResBin2 = receive_any(),
     ResBin2 = ResBin1,
     ResInfo = get_resource(binary_resource_type,ResBin2),
     Forwarder ! terminate,
-    {Forwarder, 1} = receive_any(),
+    {'DOWN', _, process, Forwarder, 1} = receive_any(),
     erlang:garbage_collect(),
     ResInfo = get_resource(binary_resource_type,ResBin1),
     ResInfo = get_resource(binary_resource_type,ResBin2),
@@ -1915,11 +1920,11 @@ send2_do1(SendBlobF) ->
     send2_do2(SendBlobF, self()),
 
     Papa = self(),
-    Forwarder = spawn_link(fun() -> forwarder(Papa) end),
+    {Forwarder,_} = spawn_monitor(fun() -> forwarder(Papa) end),
     io:format("sending to forwarder pid=~p\n",[Forwarder]),
     send2_do2(SendBlobF, Forwarder),
     Forwarder ! terminate,
-    {Forwarder, 4} = receive_any(),
+    {'DOWN', _, process, Forwarder, 4} = receive_any(),
     ok.
 
 send2_do2(SendBlobF, To) ->   
@@ -1975,7 +1980,7 @@ forwarder(To) ->
 forwarder(To, N) ->
     case receive_any() of
 	terminate ->
-	    To ! {self(), N};
+            gc_and_exit(N);
 	Msg ->	    
 	    To ! Msg,	   
 	    forwarder(To, N+1)
-- 
2.16.4

openSUSE Build Service is sponsored by