diff --git a/lib/stdlib/src/proc_lib.erl b/lib/stdlib/src/proc_lib.erl index 80909fb2c293..80da208d2a7c 100644 --- a/lib/stdlib/src/proc_lib.erl +++ b/lib/stdlib/src/proc_lib.erl @@ -1573,13 +1573,15 @@ about system messages, see `m:sys` and section stop(Process, Reason, Timeout) -> Mref = erlang:monitor(process, Process), T0 = erlang:monotonic_time(millisecond), + + StopTimeout = fun(infinity) -> infinity; + (T1) -> T1 - (((erlang:monotonic_time(microsecond) + 999) div 1000) - T0) + end, + RemainingTimeout = try sys:terminate(Process, Reason, Timeout) of - ok when Timeout =:= infinity -> - infinity; - ok -> - Timeout - (((erlang:monotonic_time(microsecond) + 999) div 1000) - T0) + ok -> StopTimeout(Timeout) catch exit:{noproc, {sys, terminate, _}} -> demonitor(Mref, [flush]), @@ -1587,6 +1589,9 @@ stop(Process, Reason, Timeout) -> exit:{timeout, {sys, terminate, _}} -> demonitor(Mref, [flush]), exit(timeout); + exit:{Reason, {sys, terminate, _}} -> + demonitor(Mref, [flush]), + StopTimeout(Timeout); exit:Reason1 -> demonitor(Mref, [flush]), exit(Reason1)