File 1434-erts-Accept-native-time-unit-where-documented-as-sup.patch of Package erlang
From 1867cff4efc3652b31b051ec84ce667b6aece3a1 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Thu, 11 Aug 2022 00:51:47 +0200
Subject: [PATCH] [erts] Accept native time unit where documented as supported
Fixes erlang:monotonic_time(native), erlang:system_time(native),
erlang:time_offset(native), and os:system_time(native).
---
erts/emulator/beam/erl_time_sup.c | 4 +++
erts/emulator/test/time_SUITE.erl | 41 +++++++++++++++++++++++++++++--
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/erts/emulator/beam/erl_time_sup.c b/erts/emulator/beam/erl_time_sup.c
index d26ea19494..56a8fa369a 100644
--- a/erts/emulator/beam/erl_time_sup.c
+++ b/erts/emulator/beam/erl_time_sup.c
@@ -2178,6 +2178,10 @@ time_unit_conversion(Process *c_p, Eterm term, ErtsMonotonicTime val, ErtsMonoto
/* Convert to common user specified time units */
switch (term) {
+ case am_native:
+ result = val + muloff*ERTS_MONOTONIC_OFFSET_NATIVE;
+ ERTS_BIF_PREP_RET(ret, make_time_val(c_p, result));
+ break;
case am_second:
case am_seconds:
case make_small(1):
diff --git a/erts/emulator/test/time_SUITE.erl b/erts/emulator/test/time_SUITE.erl
index e01efac86b..6e643fdcbe 100644
--- a/erts/emulator/test/time_SUITE.erl
+++ b/erts/emulator/test/time_SUITE.erl
@@ -42,7 +42,8 @@
monotonic_time_monotonicity_parallel/1,
time_unit_conversion/1,
signed_time_unit_conversion/1,
- erlang_timestamp/1]).
+ erlang_timestamp/1,
+ native_time_unit_gh6165/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
@@ -85,7 +86,8 @@ all() ->
monotonic_time_monotonicity_parallel,
time_unit_conversion,
signed_time_unit_conversion,
- erlang_timestamp].
+ erlang_timestamp,
+ native_time_unit_gh6165].
groups() ->
[{now, [], [now_unique, now_update]}].
@@ -857,6 +859,41 @@ process_changed_time_offset(Mon, TO, Changed, Wait) ->
end.
+native_time_unit_gh6165(Config) when is_list(Config) ->
+ %% This test could potentially fail even when no bug exists if
+ %% run during heavy load, or if OS system time or Erlang system time
+ %% is changed at an unfortunate time, but it is hard to make the test
+ %% more stable than this without losing actual testing...
+
+ ChkDiff = fun (Val) ->
+ case erlang:convert_time_unit(Val, native, nanosecond) of
+ Ns when -1000000 < Ns andalso Ns < 1000000 ->
+ erlang:display({diff, Ns}),
+ ok;
+ Ns ->
+ erlang:display({large_diff, Ns}),
+ ct:fail({large_diff, Ns})
+ end
+ end,
+
+ process_flag(priority, max),
+
+ erlang:yield(),
+ V1 = erlang:monotonic_time(native) - erlang:monotonic_time(),
+ ChkDiff(V1),
+
+ erlang:yield(),
+ V2 = erlang:system_time(native) - erlang:system_time(),
+ ChkDiff(V2),
+
+ erlang:yield(),
+ V3 = os:system_time(native) - os:system_time(),
+ ChkDiff(V3),
+
+ erlang:yield(),
+ 0 = erlang:time_offset() - erlang:time_offset(native),
+
+ ok.
%% Returns the test data: a list of {Utc, Local} tuples.
--
2.35.3