File 0957-erts-Cuddle-dirty_nif_SUITE-dirty_call_while_termina.patch of Package erlang

From ddd50170a9c093b6c998fac2b74da4014102d943 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 16 Jan 2020 16:19:28 +0100
Subject: [PATCH] erts: Cuddle dirty_nif_SUITE:dirty_call_while_terminated

---
 erts/emulator/test/dirty_nif_SUITE.erl | 48 +++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 6 deletions(-)

diff --git a/erts/emulator/test/dirty_nif_SUITE.erl b/erts/emulator/test/dirty_nif_SUITE.erl
index 6f5ec161a3..8e5e2ded6e 100644
--- a/erts/emulator/test/dirty_nif_SUITE.erl
+++ b/erts/emulator/test/dirty_nif_SUITE.erl
@@ -226,18 +226,21 @@ dirty_call_while_terminated(Config) when is_list(Config) ->
 						  element(2,
 							  process_info(self(),
 								       binary))),
-    receive after 2000 -> ok end,
     receive
 	Msg ->
 	    ct:fail({unexpected_message, Msg})
     after
-	0 ->
+	1000 ->
 	    ok
     end,
-    {value, {BinAddr, 4711, 1}} = lists:keysearch(4711, 2,
-						  element(2,
-							  process_info(self(),
-								       binary))),
+    ok = wait_until(fun() ->
+                       {value, {BinAddr, 4711, 1}} ==
+                           lists:keysearch(4711, 2,
+                                           element(2,
+                                                   process_info(self(),
+                                                                binary)))
+               end,
+               10000),
     process_flag(trap_exit, OT),
     try
 	blipp:blupp(Bin)
@@ -714,6 +717,39 @@ nif_whereis_proxy(Ref) ->
             ok
     end.
 
+wait_until(Fun, infinity) ->
+    wait_until_aux(Fun, infinity);
+wait_until(Fun, MaxTime) ->
+    End = erlang:monotonic_time(millisecond) + MaxTime,
+    wait_until_aux(Fun, End).
+
+wait_until_aux(Fun, End) ->
+    case Fun() of
+        true ->
+            ok;
+        _ ->
+            if End == infinity ->
+                    receive after 100 -> ok end,
+                    wait_until_aux(Fun, infinity);
+               true ->
+                    Now = erlang:monotonic_time(millisecond),
+                    case End =< Now of
+                        true ->
+                            timeout;
+                        _ ->
+                            Wait = case End - Now of
+                                       Short when End - Now < 100 ->
+                                           Short;
+                                       _ ->
+                                           100
+                                   end,
+                            receive after Wait -> ok end,
+                            wait_until_aux(Fun, End)
+                    end
+            end
+    end.
+
+
 %% The NIFs:
 lib_loaded() -> false.
 call_dirty_nif(_,_,_) -> ?nif_stub.
-- 
2.16.4

openSUSE Build Service is sponsored by