From fbaa0becc787e73fa539e0d497b0d74be27c9534 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Wed, 17 Dec 2014 22:18:27 +0100
Subject: Replace usage of erlang:now() with usage of new API

---
 lib/asn1/src/asn1.app.src              |  2 +-
 lib/asn1/src/asn1ct_value.erl          |  5 +++--
 lib/compiler/src/compile.erl           |  5 +++--
 lib/compiler/src/compiler.app.src      |  2 +-
 lib/dialyzer/src/dialyzer.app.src      |  2 +-
 lib/dialyzer/src/dialyzer_timing.erl   | 10 +++++-----
 lib/hipe/main/hipe.app.src             |  2 +-
 lib/hipe/tools/hipe_timer.erl          | 18 +++++++++---------
 lib/kernel/src/auth.erl                |  4 ++--
 lib/kernel/src/dist_util.erl           |  6 ++++--
 lib/kernel/src/global.erl              | 18 ++++++++++--------
 lib/kernel/src/inet_db.erl             |  3 +--
 lib/kernel/src/inet_res.erl            | 14 +++++++++-----
 lib/kernel/src/kernel.app.src          |  2 +-
 lib/kernel/src/pg2.erl                 | 11 +++++++----
 lib/mnesia/src/mnesia_lib.erl          | 10 ++++++++--
 lib/reltool/src/reltool.app.src        |  2 +-
 lib/reltool/src/reltool_fgraph_win.erl |  6 +++---
 lib/stdlib/doc/src/calendar.xml        |  6 ++++--
 lib/stdlib/doc/src/file_sorter.xml     |  6 +++---
 lib/stdlib/doc/src/random.xml          |  9 ++++-----
 lib/stdlib/doc/src/timer.xml           | 10 ++++++----
 lib/stdlib/src/calendar.erl            |  2 +-
 lib/stdlib/src/dets.erl                | 22 ++++++++++++++--------
 lib/stdlib/src/dets_utils.erl          |  2 +-
 lib/stdlib/src/erl_tar.erl             |  2 +-
 lib/stdlib/src/escript.erl             |  8 +++++---
 lib/stdlib/src/file_sorter.erl         |  4 ++--
 lib/stdlib/src/qlc.erl                 |  4 ++--
 lib/stdlib/src/random.erl              |  8 +++++++-
 lib/stdlib/src/stdlib.app.src          |  2 +-
 lib/stdlib/src/supervisor.erl          | 17 ++---------------
 lib/stdlib/src/timer.erl               |  6 ++----
 33 files changed, 125 insertions(+), 105 deletions(-)

(limited to 'lib')

diff --git a/lib/asn1/src/asn1.app.src b/lib/asn1/src/asn1.app.src
index 02cbba0f10..1f8805ff5e 100644
--- a/lib/asn1/src/asn1.app.src
+++ b/lib/asn1/src/asn1.app.src
@@ -11,5 +11,5 @@
 		]},
   {env, []},
   {applications, [kernel, stdlib]},
-  {runtime_dependencies, ["stdlib-2.0","kernel-3.0","erts-6.0"]}
+  {runtime_dependencies, ["stdlib-2.0","kernel-3.0","erts-7.0"]}
   ]}.
diff --git a/lib/asn1/src/asn1ct_value.erl b/lib/asn1/src/asn1ct_value.erl
index 221cd991a7..c5901d5489 100644
--- a/lib/asn1/src/asn1ct_value.erl
+++ b/lib/asn1/src/asn1ct_value.erl
@@ -352,8 +352,9 @@ random_unnamed_bit_string(M, C) ->
 %%     end.
 
 random(Upper) ->
-    {A1,A2,A3} = erlang:now(),
-    _ = random:seed(A1, A2, A3),
+    _ = random:seed(erlang:phash2([erlang:node()]),
+		    erlang:monotonic_time(),
+		    erlang:unique_integer()),
     random:uniform(Upper).
 
 size_random(C) ->
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index c7d91070f6..bfa7267ab7 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -1300,8 +1300,9 @@ encrypt({des3_cbc=Type,Key,IVec,BlockSize}, Bin0) ->
     list_to_binary([0,length(TypeString),TypeString,Bin]).
 
 random_bytes(N) ->
-    {A,B,C} = now(),
-    _ = random:seed(A, B, C),
+    _ = random:seed(erlang:time_offset(),
+		    erlang:monotonic_time(),
+		    erlang:unique_integer()),
     random_bytes_1(N, []).
 
 random_bytes_1(0, Acc) -> Acc;
diff --git a/lib/compiler/src/compiler.app.src b/lib/compiler/src/compiler.app.src
index 8f68915f8e..8e2cb86637 100644
--- a/lib/compiler/src/compiler.app.src
+++ b/lib/compiler/src/compiler.app.src
@@ -68,5 +68,5 @@
   {registered, []},
   {applications, [kernel, stdlib]},
   {env, []},
-  {runtime_dependencies, ["stdlib-2.0","kernel-3.0","hipe-3.10.3","erts-6.0",
+  {runtime_dependencies, ["stdlib-2.0","kernel-3.0","hipe-3.10.3","erts-7.0",
 			  "crypto-3.3"]}]}.
diff --git a/lib/dialyzer/src/dialyzer.app.src b/lib/dialyzer/src/dialyzer.app.src
index 1756800c4f..7b2e1d4a9d 100644
--- a/lib/dialyzer/src/dialyzer.app.src
+++ b/lib/dialyzer/src/dialyzer.app.src
@@ -46,5 +46,5 @@
   {applications, [compiler, gs, hipe, kernel, stdlib, wx]},
   {env, []},
   {runtime_dependencies, ["wx-1.2","syntax_tools-1.6.14","stdlib-2.0",
-			  "kernel-3.0","hipe-3.10.3","erts-6.0",
+			  "kernel-3.0","hipe-3.10.3","erts-7.0",
 			  "compiler-5.0"]}]}.
diff --git a/lib/dialyzer/src/dialyzer_timing.erl b/lib/dialyzer/src/dialyzer_timing.erl
index b1a4bdc07c..759d49abc8 100644
--- a/lib/dialyzer/src/dialyzer_timing.erl
+++ b/lib/dialyzer/src/dialyzer_timing.erl
@@ -38,7 +38,7 @@ init(Active) ->
   case Active of
     true ->
       io:format("\n"),
-      spawn_link(fun() -> loop(now(), 0, "") end);
+      spawn_link(fun() -> loop(erlang:monotonic_time(), 0, "") end);
     debug ->
       io:format("\n"),
       spawn_link(fun() -> debug_loop("") end);
@@ -105,14 +105,14 @@ debug_loop(Phase) ->
 
 start_stamp(none, _) -> ok;
 start_stamp(Pid, Msg) ->
-  Pid ! {stamp, Msg, now()},
+  Pid ! {stamp, Msg, erlang:monotonic_time()},
   ok.
 
 -spec end_stamp(timing_server()) -> ok.
 
 end_stamp(none) -> ok;
 end_stamp(Pid) ->
-  Pid ! {stamp, now()},
+  Pid ! {stamp, erlang:monotonic_time()},
   ok.
 
 -spec send_size_info(timing_server(), integer(), string()) -> ok.
@@ -126,8 +126,8 @@ send_size_info(Pid, Size, Unit) ->
 
 stop(none) -> ok;
 stop(Pid) ->
-  Pid ! {self(), stop, now()},
+  Pid ! {self(), stop, erlang:monotonic_time()},
   receive ok -> ok end.
 
 diff(T2, T1) ->
-  timer:now_diff(T2,T1) / 1000000.
+  (T2-T1) / erlang:convert_time_unit(1, seconds, native).
diff --git a/lib/hipe/main/hipe.app.src b/lib/hipe/main/hipe.app.src
index e81212d4dc..22ea71b4e6 100644
--- a/lib/hipe/main/hipe.app.src
+++ b/lib/hipe/main/hipe.app.src
@@ -224,4 +224,4 @@
   {applications, [kernel,stdlib]},
   {env, []},
   {runtime_dependencies, ["syntax_tools-1.6.14","stdlib-2.0","kernel-3.0",
-			  "erts-6.0","compiler-5.0"]}]}.
+			  "erts-7.0","compiler-5.0"]}]}.
diff --git a/lib/hipe/tools/hipe_timer.erl b/lib/hipe/tools/hipe_timer.erl
index 03cc358f17..5f44bc066d 100644
--- a/lib/hipe/tools/hipe_timer.erl
+++ b/lib/hipe/tools/hipe_timer.erl
@@ -46,27 +46,27 @@ tr(F) ->
   {R,{WT-EWT,(RT-ERT)/1000}}.
 
 empty_time() ->
-  {WT1,WT2,WT3} = erlang:now(),
+  WTA = erlang:monotonic_time(),
   {A,_} = erlang:statistics(runtime),
-  {WT12,WT22,WT32} = erlang:now(),
+  WTB = erlang:monotonic_time(),
   {B,_} = erlang:statistics(runtime),
-  {(WT12-WT1)*1000000+(WT22-WT2)+(WT32-WT3)/1000000,B-A}.
+  {(WTB-WTA)/erlang:convert_time_unit(1, seconds, native),B-A}.
 
 time(F) -> 
-  {WT1,WT2,WT3} = erlang:now(),
+  WTA = erlang:monotonic_time(),
   {A,_} = erlang:statistics(runtime),
   F(),
-  {WT12,WT22,WT32} = erlang:now(),
+  WTB = erlang:monotonic_time(),
   {B,_} = erlang:statistics(runtime),
-  {(WT12-WT1)*1000000+(WT22-WT2)+(WT32-WT3)/1000000,B-A}.
+  {(WTB-WTA)/erlang:convert_time_unit(1, seconds, native),B-A}.
 
 timer(F) -> 
-  {WT1,WT2,WT3} = erlang:now(),
+  WTA = erlang:monotonic_time(),
   {A,_} = erlang:statistics(runtime),
   R = F(),
-  {WT12,WT22,WT32} = erlang:now(),
+  WTB = erlang:monotonic_time(),
   {B,_} = erlang:statistics(runtime),
-  {R,{(WT12-WT1)*1000000+(WT22-WT2)+(WT32-WT3)/1000000,B-A}}.
+  {R,{(WTB-WTA)/erlang:convert_time_unit(1, seconds, native),B-A}}.
 
 advanced(_Fun, I) when I < 2 -> false;
 advanced(Fun, Iterations) ->
diff --git a/lib/kernel/src/auth.erl b/lib/kernel/src/auth.erl
index eda35147d3..dbc486bee1 100644
--- a/lib/kernel/src/auth.erl
+++ b/lib/kernel/src/auth.erl
@@ -370,8 +370,8 @@ check_cookie1([], Result) ->
 %% Creates a new, random cookie. 
    
 create_cookie(Name) ->
-    {_, S1, S2} = now(),
-    Seed = S2*10000+S1,
+    Seed = abs(erlang:monotonic_time()
+	       bxor erlang:unique_integer()),
     Cookie = random_cookie(20, Seed, []),
     case file:open(Name, [write, raw]) of
 	{ok, File} ->
diff --git a/lib/kernel/src/dist_util.erl b/lib/kernel/src/dist_util.erl
index b127fe2e33..6b510bd0c3 100644
--- a/lib/kernel/src/dist_util.erl
+++ b/lib/kernel/src/dist_util.erl
@@ -298,7 +298,7 @@ shutdown(_Module, _Line, _Data, Reason) ->
     exit(Reason).
 %% Use this line to debug connection.  
 %% Set net_kernel verbose = 1 as well.
-%%    exit({Reason, ?MODULE, _Line, _Data, erlang:now()}).
+%%    exit({Reason, ?MODULE, _Line, _Data, erlang:timestamp()}).
 
 
 flush_down() ->
@@ -373,7 +373,9 @@ gen_digest(Challenge, Cookie) when is_integer(Challenge), is_atom(Cookie) ->
 %% gen_challenge() returns a "random" number
 %% ---------------------------------------------------------------
 gen_challenge() ->
-    {A,B,C} = erlang:now(),
+    A = erlang:phash2([erlang:node()]),
+    B = erlang:monotonic_time(),
+    C = erlang:unique_integer(),
     {D,_}   = erlang:statistics(reductions),
     {E,_}   = erlang:statistics(runtime),
     {F,_}   = erlang:statistics(wall_clock),
diff --git a/lib/kernel/src/global.erl b/lib/kernel/src/global.erl
index 0a4edea452..6c36d417a2 100644
--- a/lib/kernel/src/global.erl
+++ b/lib/kernel/src/global.erl
@@ -881,11 +881,12 @@ handle_info({nodeup, Node}, S0) when S0#state.connect_all ->
 	false ->
 	    resend_pre_connect(Node),
 
-	    %% now() is used as a tag to separate different synch sessions
+	    %% erlang:unique_integer([monotonic]) is used as a tag to
+	    %% separate different synch sessions
 	    %% from each others. Global could be confused at bursty nodeups
 	    %% because it couldn't separate the messages between the different
 	    %% synch sessions started by a nodeup.
-	    MyTag = now(),
+	    MyTag = erlang:unique_integer([monotonic]),
 	    put({sync_tag_my, Node}, MyTag),
             ?trace({sending_nodeup_to_locker, {node,Node},{mytag,MyTag}}),
 	    S1#state.the_locker ! {nodeup, Node, MyTag},
@@ -1772,8 +1773,8 @@ update_locker_known(Upd, S) ->
     S#multi{known = Known, the_boss = TheBoss}.
 
 random_element(L) ->
-    {A,B,C} = now(),
-    E = (A+B+C) rem length(L),
+    E = abs(erlang:monotonic_time()
+		bxor erlang:unique_integer()) rem length(L),
     lists:nth(E+1, L).
 
 exclude_known(Others, Known) ->
@@ -2072,9 +2073,10 @@ random_sleep(Times) ->
     end,
     case get(random_seed) of
 	undefined ->
-	    {A1, A2, A3} = now(),
-	    _ = random:seed(A1, A2, A3 + erlang:phash(node(), 100000)),
-            ok;
+	    _ = random:seed(erlang:phash2([erlang:node()]),
+			    erlang:monotonic_time(),
+			    erlang:unique_integer()),
+	    ok;
 	_ -> ok
     end,
     %% First time 1/4 seconds, then doubling each time up to 8 seconds max.
@@ -2106,7 +2108,7 @@ trace_message(S, M, X) ->
     S#state{trace = [trace_message(M, X) | S#state.trace]}.
 
 trace_message(M, X) ->
-    {node(), now(), M, nodes(), X}.
+    {node(), erlang:timestamp(), M, nodes(), X}.
 
 %%-----------------------------------------------------------------
 %% Each sync process corresponds to one call to sync. Each such
diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl
index 2ebdc0f554..abe207295f 100644
--- a/lib/kernel/src/inet_db.erl
+++ b/lib/kernel/src/inet_db.erl
@@ -1372,8 +1372,7 @@ cache_rr(_Db, Cache, RR) ->
     ets:insert(Cache, RR).
 
 times() ->
-    {Mega,Secs,_} = erlang:now(),
-    Mega*1000000 + Secs.
+    erlang:monotonic_time(1).
 
 %% lookup and remove old entries
 
diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl
index 6037da1d22..410128a16a 100644
--- a/lib/kernel/src/inet_res.erl
+++ b/lib/kernel/src/inet_res.erl
@@ -715,10 +715,10 @@ udp_send(#sock{inet=I}, {A,B,C,D}=IP, Port, Buffer)
 
 udp_recv(#sock{inet6=I}, {A,B,C,D,E,F,G,H}=IP, Port, Timeout, Decode)
   when ?ip6(A,B,C,D,E,F,G,H), ?port(Port) ->
-    do_udp_recv(I, IP, Port, Timeout, Decode, erlang:now(), Timeout);
+    do_udp_recv(I, IP, Port, Timeout, Decode, time_now(), Timeout);
 udp_recv(#sock{inet=I}, {A,B,C,D}=IP, Port, Timeout, Decode)
   when ?ip(A,B,C,D), ?port(Port) ->
-    do_udp_recv(I, IP, Port, Timeout, Decode, erlang:now(), Timeout).
+    do_udp_recv(I, IP, Port, Timeout, Decode, time_now(), Timeout).
 
 do_udp_recv(_I, _IP, _Port, 0, _Decode, _Start, _T) ->
     timeout;
@@ -742,7 +742,7 @@ do_udp_recv(I, IP, Port, Timeout, Decode, Start, T) ->
 		    NewTimeout = erlang:max(0, Timeout - 50),
 		    do_udp_recv(I, IP, Port, NewTimeout, Decode, Start, T);
 		false ->
-		    Now = erlang:now(),
+		    Now = time_now(),
 		    NewT = erlang:max(0, Timeout - now_ms(Now, Start)),
 		    do_udp_recv(I, IP, Port, Timeout, Decode, Start, NewT);
 		Result ->
@@ -1057,5 +1057,9 @@ dns_msg(Msg) ->
     end.
 
 -compile({inline, [now_ms/2]}).
-now_ms({Meg1,Sec1,Mic1}, {Meg0,Sec0,Mic0}) ->
-    ((Meg1-Meg0)*1000000 + (Sec1-Sec0))*1000 + ((Mic1-Mic0) div 1000).
+now_ms(Int1, Int0) ->
+    Int1 - Int0.
+
+-compile({inline, [time_now/0]}).
+time_now() ->
+	erlang:monotonic_time(1000).
diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src
index 9f6c0f4624..0cb10791d7 100644
--- a/lib/kernel/src/kernel.app.src
+++ b/lib/kernel/src/kernel.app.src
@@ -115,6 +115,6 @@
   {applications, []},
   {env, [{error_logger, tty}]},
   {mod, {kernel, []}},
-  {runtime_dependencies, ["erts-6.1.2", "stdlib-2.0", "sasl-2.4"]}
+  {runtime_dependencies, ["erts-7.0", "stdlib-2.0", "sasl-2.4"]}
  ]
 }.
diff --git a/lib/kernel/src/pg2.erl b/lib/kernel/src/pg2.erl
index b562d4ffd2..70d7a75671 100644
--- a/lib/kernel/src/pg2.erl
+++ b/lib/kernel/src/pg2.erl
@@ -140,19 +140,22 @@ get_closest_pid(Name) ->
         [Pid] ->
             Pid;
         [] ->
-            {_,_,X} = erlang:now(),
             case get_members(Name) of
                 [] -> {error, {no_process, Name}};
                 Members ->
-                    lists:nth((X rem length(Members))+1, Members)
+                    random_element(Members)
             end;
         Members when is_list(Members) ->
-            {_,_,X} = erlang:now(),
-            lists:nth((X rem length(Members))+1, Members);
+            random_element(Members);
         Else ->
             Else
     end.
 
+random_element(List) ->
+    X = abs(erlang:monotonic_time()
+		bxor erlang:unique_integer()),
+    lists:nth((X rem length(List)) + 1, List).
+
 %%%
 %%% Callback functions from gen_server
 %%%
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index a32c69c59e..b2103b2ef8 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -930,8 +930,14 @@ random_time(Retries, _Counter0) ->
     
     case get(random_seed) of
 	undefined ->
-	    {X, Y, Z} = erlang:now(), %% time()
-	    _ = random:seed(X, Y, Z),
+	    try
+		_ = random:seed(erlang:phash2([erlang:node()]),
+				erlang:monotonic_time(),
+				erlang:unique_integer())
+	    catch
+		error:_ ->
+		    _ = random:seed(erlang:now())
+	    end,
 	    Time = Dup + random:uniform(MaxIntv),
 	    %%	    dbg_out("---random_test rs ~w max ~w val ~w---~n", [Retries, MaxIntv, Time]),
 	    Time;
diff --git a/lib/reltool/src/reltool.app.src b/lib/reltool/src/reltool.app.src
index 65fcf4aae5..579d2c0d1b 100644
--- a/lib/reltool/src/reltool.app.src
+++ b/lib/reltool/src/reltool.app.src
@@ -36,5 +36,5 @@
   {applications, [stdlib, kernel]},
   {env, []},
   {runtime_dependencies, ["wx-1.2","tools-2.6.14","stdlib-2.0","sasl-2.4",
-			  "kernel-3.0","erts-6.0"]}
+			  "kernel-3.0","erts-7.0"]}
  ]}.
diff --git a/lib/reltool/src/reltool_fgraph_win.erl b/lib/reltool/src/reltool_fgraph_win.erl
index 66bc2b5ab3..d9e6f6d427 100644
--- a/lib/reltool/src/reltool_fgraph_win.erl
+++ b/lib/reltool/src/reltool_fgraph_win.erl
@@ -252,10 +252,10 @@ ticker_init(Pid) ->
 ticker_loop(Pid, Time) ->
     receive after Time ->
         Pid ! {self(), redraw},
-        T0 = now(),
+        T0 = erlang:monotonic_time(),
         receive {Pid, ok} -> ok end,
-        T1 = now(),
-        D = timer:now_diff(T1, T0)/1000,
+        T1 = erlang:monotonic_time(),
+        D = erlang:convert_time_unit(T1-T0, native, milli_seconds),
         case round(40 - D) of
             Ms when Ms < 0 ->
                 %io:format("ticker: wait is   0 ms [fg ~7s ms] [fps ~7s]~n",
diff --git a/lib/stdlib/doc/src/calendar.xml b/lib/stdlib/doc/src/calendar.xml
index e32a639b81..d8193a9ec2 100644
--- a/lib/stdlib/doc/src/calendar.xml
+++ b/lib/stdlib/doc/src/calendar.xml
@@ -270,7 +270,8 @@
       <fsummary>Convert now to local date and time</fsummary>
       <desc>
         <p>This function returns local date and time converted from
-          the return value from <c>erlang:now()</c>.</p>
+        the return value from
+	<seealso marker="erts:erlang#timestamp/0"><c>erlang:timestamp/0</c></seealso>.</p>
       </desc>
     </func>
     <func>
@@ -279,7 +280,8 @@
       <fsummary>Convert now to date and time</fsummary>
       <desc>
         <p>This function returns Universal Coordinated Time (UTC)
-          converted from the return value from <c>erlang:now()</c>.</p>
+        converted from the return value from
+	<seealso marker="erts:erlang#timestamp/0"><c>erlang:timestamp/0</c></seealso>.</p>
       </desc>
     </func>
     <func>
diff --git a/lib/stdlib/doc/src/file_sorter.xml b/lib/stdlib/doc/src/file_sorter.xml
index 16572df3c5..c069333c29 100644
--- a/lib/stdlib/doc/src/file_sorter.xml
+++ b/lib/stdlib/doc/src/file_sorter.xml
@@ -105,9 +105,9 @@
       <c>file:get_cwd()</c> is used instead. The names of
        temporary files are derived from the Erlang nodename
        (<c>node()</c>), the process identifier of the current Erlang
-       emulator (<c>os:getpid()</c>), and a timestamp
-       (<c>erlang:now()</c>); a typical name would be
-      <c>fs_mynode@myhost_1763_1043_337000_266005.17</c>, where
+       emulator (<c>os:getpid()</c>), and a unique integer
+       (<c>erlang:unique_integer([positive])</c>); a typical name would be
+      <c>fs_mynode@myhost_1763_4711.17</c>, where
       <c>17</c> is a sequence number. Existing files will be
        overwritten. Temporary files are deleted unless some
        uncaught EXIT signal occurs.
diff --git a/lib/stdlib/doc/src/random.xml b/lib/stdlib/doc/src/random.xml
index e001058e19..2cc621ffc3 100644
--- a/lib/stdlib/doc/src/random.xml
+++ b/lib/stdlib/doc/src/random.xml
@@ -70,12 +70,11 @@
       <desc>
         <p>Seeds random number generation with integer values in the process
           dictionary, and returns the old state.</p>
-        <p>One way of obtaining a seed is to use the BIF <c>now/0</c>:</p>
+        <p>One easy way of obtaining a unique value to seed with is to:</p>
         <code type="none">
-          ...
-          {A1,A2,A3} = now(),
-          random:seed(A1, A2, A3),
-          ...</code>
+          random:seed(<seealso marker="erts:erlang#phash2/1">erlang:phash2</seealso>([<seealso marker="erts:erlang#node/0">node()</seealso>]),
+	              <seealso marker="erts:erlang#monotonic_time/0">erlang:monotonic_time()</seealso>,
+		      <seealso marker="erts:erlang#unique_integer/0">erlang:unique_integer()</seealso>)</code>
       </desc>
     </func>
     <func>
diff --git a/lib/stdlib/doc/src/timer.xml b/lib/stdlib/doc/src/timer.xml
index eca9a72d36..791a29689e 100644
--- a/lib/stdlib/doc/src/timer.xml
+++ b/lib/stdlib/doc/src/timer.xml
@@ -217,12 +217,14 @@
     </func>
     <func>
       <name name="now_diff" arity="2"/>
-      <fsummary>Calculate time difference between <c>now/0</c>timestamps</fsummary>
+      <fsummary>Calculate time difference between timestamps</fsummary>
       <type_desc variable="Tdiff">In microseconds</type_desc>
       <desc>
         <p>Calculates the time difference <c><anno>Tdiff</anno> = <anno>T2</anno> - <anno>T1</anno></c> in
-          <em>microseconds</em>, where <c><anno>T1</anno></c> and <c><anno>T2</anno></c> probably
-          are timestamp tuples returned from <c>erlang:now/0</c>.</p>
+        <em>microseconds</em>, where <c><anno>T1</anno></c> and <c><anno>T2</anno></c>
+        are timestamp tuples on the same format as returned from
+	<seealso marker="erts:erlang#timestamp/0"><c>erlang:timestamp/0</c></seealso>,
+	or <seealso marker="kernel:os#timestamp/0"><c>os:timestamp/0</c></seealso>.</p>
       </desc>
     </func>
     <func>
@@ -234,7 +236,7 @@
     </func>
     <func>
       <name name="minutes" arity="1"/>
-      <fsummary>Converts <c>Minutes</c>to <c>Milliseconds</c>.</fsummary>
+      <fsummary>Converts <c>Minutes</c> to <c>Milliseconds</c>.</fsummary>
       <desc>
         <p>Return the number of milliseconds in <c><anno>Minutes</anno></c>.</p>
       </desc>
diff --git a/lib/stdlib/src/calendar.erl b/lib/stdlib/src/calendar.erl
index 0320e0cd0e..d08001c933 100644
--- a/lib/stdlib/src/calendar.erl
+++ b/lib/stdlib/src/calendar.erl
@@ -299,7 +299,7 @@ local_time_to_universal_time_dst(DateTime) ->
 %% now_to_universal_time(Now)
 %% now_to_datetime(Now)
 %%
-%% Convert from now() to UTC.
+%% Convert from erlang:timestamp() to UTC.
 %%
 %% Args: Now = now(); now() = {MegaSec, Sec, MilliSec}, MegaSec = Sec
 %% = MilliSec = integer() 
diff --git a/lib/stdlib/src/dets.erl b/lib/stdlib/src/dets.erl
index a4bd45ea19..5d365ac962 100644
--- a/lib/stdlib/src/dets.erl
+++ b/lib/stdlib/src/dets.erl
@@ -1963,7 +1963,7 @@ do_safe_fixtable(Head, Pid, true) ->
     case Head#head.fixed of 
 	false -> 
 	    link(Pid),
-	    Fixed = {erlang:now(), [{Pid, 1}]},
+	    Fixed = {utime_now(), [{Pid, 1}]},
 	    Ftab = dets_utils:get_freelists(Head),
 	    Head#head{fixed = Fixed, freelists = {Ftab, Ftab}};
 	{TimeStamp, Counters} ->
@@ -3088,14 +3088,14 @@ update_cache(Head, ToAdd) ->
 	    {Head1, Found, []};
 	Cache#cache.wrtime =:= undefined ->
 	    %% Empty cache. Schedule a delayed write.
-	    Now = now(), Me = self(),
+	    Now = time_now(), Me = self(),
 	    Call = ?DETS_CALL(Me, {delayed_write, Now}),
 	    erlang:send_after(Cache#cache.delay, Me, Call),
 	    {Head1#head{cache = NewCache#cache{wrtime = Now}}, Found, []};
 	Size0 =:= 0 ->
 	    %% Empty cache that has been written after the
 	    %% currently scheduled delayed write.
-	    {Head1#head{cache = NewCache#cache{wrtime = now()}}, Found, []};
+	    {Head1#head{cache = NewCache#cache{wrtime = time_now()}}, Found, []};
 	true ->
 	    %% Cache is not empty, delayed write has been scheduled.
 	    {Head1, Found, []}
@@ -3158,11 +3158,7 @@ delayed_write(Head, WrTime) ->
 		    Head#head{cache = NewCache};
 		true ->
 		    %% Yes, schedule a new delayed write.
-		    {MS1,S1,M1} = WrTime,
-		    {MS2,S2,M2} = LastWrTime,
-		    WrT = M1+1000000*(S1+1000000*MS1),
-		    LastWrT = M2+1000000*(S2+1000000*MS2),
-		    When = round((LastWrT - WrT)/1000), Me = self(),
+		    When = round((LastWrTime - WrTime)/1000), Me = self(),
 		    Call = ?DETS_CALL(Me, {delayed_write, LastWrTime}),
 		    erlang:send_after(When, Me, Call),
 		    Head
@@ -3274,6 +3270,16 @@ err(Error) ->
 	    Error
     end.
 
+-compile({inline, [time_now/0]}).
+time_now() ->
+    erlang:monotonic_time(1000000).
+
+-compile({inline, [utime_now/0]}).
+utime_now() ->
+    Time = time_now(),
+    UniqueCounter = erlang:unique_integer([monotonic]),
+    {Time, UniqueCounter}.
+
 %%%%%%%%%%%%%%%%%  DEBUG functions %%%%%%%%%%%%%%%%
 
 file_info(FileName) ->
diff --git a/lib/stdlib/src/dets_utils.erl b/lib/stdlib/src/dets_utils.erl
index 6c176ad513..26e22dbd5b 100644
--- a/lib/stdlib/src/dets_utils.erl
+++ b/lib/stdlib/src/dets_utils.erl
@@ -447,7 +447,7 @@ reset_cache(C) ->
 		    WrTime =:= undefined ->
 			WrTime;
 		    true ->
-			now()
+			erlang:monotonic_time(1000000)
 		end,
     PK = family(C#cache.cache),
     NewC = C#cache{cache = [], csize = 0, inserts = 0, wrtime = NewWrTime},
diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl
index caa3276d09..72bd54fa29 100644
--- a/lib/stdlib/src/erl_tar.erl
+++ b/lib/stdlib/src/erl_tar.erl
@@ -300,7 +300,7 @@ format_error(Term) ->
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 add1(TarFile, Bin, NameInArchive, Opts) when is_binary(Bin) ->
-    Now = calendar:now_to_local_time(now()),
+    Now = calendar:now_to_local_time(erlang:timestamp()),
     Info = #file_info{size = byte_size(Bin),
 		      type = regular,
 		      access = read_write,
diff --git a/lib/stdlib/src/escript.erl b/lib/stdlib/src/escript.erl
index 6bd0eb8a22..90e1f3a8d6 100644
--- a/lib/stdlib/src/escript.erl
+++ b/lib/stdlib/src/escript.erl
@@ -663,7 +663,8 @@ check_source(S, CheckOnly) ->
     end.
 
 pre_def_macros(File) ->
-    {MegaSecs, Secs, MicroSecs} = erlang:now(),
+    {MegaSecs, Secs, MicroSecs} = erlang:timestamp(),
+    Unique = erlang:unique_integer([positive]),
     Replace = fun(Char) ->
 		      case Char of
 			  $\. -> $\_;
@@ -675,8 +676,9 @@ pre_def_macros(File) ->
 	CleanBase ++ "__" ++
         "escript__" ++
         integer_to_list(MegaSecs) ++ "__" ++
-        integer_to_list(Secs) ++ "__" ++
-        integer_to_list(MicroSecs),
+	integer_to_list(Secs) ++ "__" ++
+	integer_to_list(MicroSecs) ++ "__" ++
+	integer_to_list(Unique),
     Module = list_to_atom(ModuleStr),
     PreDefMacros = [{'MODULE', Module, redefine},
                     {'MODULE_STRING', ModuleStr, redefine}],
diff --git a/lib/stdlib/src/file_sorter.erl b/lib/stdlib/src/file_sorter.erl
index 687d72b4bd..61b489513a 100644
--- a/lib/stdlib/src/file_sorter.erl
+++ b/lib/stdlib/src/file_sorter.erl
@@ -1425,8 +1425,8 @@ tmp_prefix1(Dir, TmpDirOpt) ->
     U = "_",
     Node = node(),
     Pid = os:getpid(),
-    {MSecs,Secs,MySecs} = now(),
-    F = lists:concat(["fs_",Node,U,Pid,U,MSecs,U,Secs,U,MySecs,"."]),
+    Unique = erlang:unique_integer([positive]),
+    F = lists:concat(["fs_",Node,U,Pid,U,Unique,"."]),
     TmpDir = case TmpDirOpt of
                  default ->
                      Dir;
diff --git a/lib/stdlib/src/qlc.erl b/lib/stdlib/src/qlc.erl
index 002032d48d..5b19ee6190 100644
--- a/lib/stdlib/src/qlc.erl
+++ b/lib/stdlib/src/qlc.erl
@@ -2764,8 +2764,8 @@ tmp_filename(TmpDirOpt) ->
     U = "_",
     Node = node(),
     Pid = os:getpid(),
-    {MSecs,Secs,MySecs} = erlang:now(),
-    F = lists:concat([?MODULE,U,Node,U,Pid,U,MSecs,U,Secs,U,MySecs]),
+    Unique = erlang:unique_integer(),
+    F = lists:concat([?MODULE,U,Node,U,Pid,U,Unique]),
     TmpDir = case TmpDirOpt of
                  "" ->
                      {ok, CurDir} = file:get_cwd(),
diff --git a/lib/stdlib/src/random.erl b/lib/stdlib/src/random.erl
index d7b51a151c..cf84f8cecf 100644
--- a/lib/stdlib/src/random.erl
+++ b/lib/stdlib/src/random.erl
@@ -57,11 +57,17 @@ seed() ->
 %% seed({A1, A2, A3}) 
 %%  Seed random number generation 
 
--spec seed({A1, A2, A3}) -> 'undefined' | ran() when
+-spec seed(SValue) -> 'undefined' | ran() when
+      SValue :: {A1, A2, A3} | integer(),
       A1 :: integer(),
       A2 :: integer(),
       A3 :: integer().
 
+seed(Int) when is_integer(Int) ->
+    A1 = (Int bsr 16) band 16#fffffff,
+    A2 = Int band 16#ffffff,
+    A3 = (Int bsr 36) bor (A2 bsr 16),
+    seed(A1, A2, A3);
 seed({A1, A2, A3}) ->
     seed(A1, A2, A3).
 
diff --git a/lib/stdlib/src/stdlib.app.src b/lib/stdlib/src/stdlib.app.src
index aa9899da3b..5edcc28418 100644
--- a/lib/stdlib/src/stdlib.app.src
+++ b/lib/stdlib/src/stdlib.app.src
@@ -103,7 +103,7 @@
                dets]},
   {applications, [kernel]},
   {env, []},
-  {runtime_dependencies, ["sasl-2.4","kernel-3.0.2","erts-6.2","crypto-3.3",
+  {runtime_dependencies, ["sasl-2.4","kernel-3.0.2","erts-7.0","crypto-3.3",
 			  "compiler-5.0"]}
 ]}.
 
diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl
index ede2742875..4979179b5c 100644
--- a/lib/stdlib/src/supervisor.erl
+++ b/lib/stdlib/src/supervisor.erl
@@ -1312,7 +1312,7 @@ add_restart(State) ->
     I = State#state.intensity,
     P = State#state.period,
     R = State#state.restarts,
-    Now = erlang:now(),
+    Now = erlang:monotonic_time(1),
     R1 = add_restart([Now|R], Now, P),
     State1 = State#state{restarts = R1},
     case length(R1) of
@@ -1333,26 +1333,13 @@ add_restart([], _, _) ->
     [].
 
 inPeriod(Time, Now, Period) ->
-    case difference(Time, Now) of
+    case Time - Now of
 	T when T > Period ->
 	    false;
 	_ ->
 	    true
     end.
 
-%%
-%% Time = {MegaSecs, Secs, MicroSecs} (NOTE: MicroSecs is ignored)
-%% Calculate the time elapsed in seconds between two timestamps.
-%% If MegaSecs is equal just subtract Secs.
-%% Else calculate the Mega difference and add the Secs difference,
-%% note that Secs difference can be negative, e.g.
-%%      {827, 999999, 676} diff {828, 1, 653753} == > 2 secs.
-%%
-difference({TimeM, TimeS, _}, {CurM, CurS, _}) when CurM > TimeM ->
-    ((CurM - TimeM) * 1000000) + (CurS - TimeS);
-difference({_, TimeS, _}, {_, CurS, _}) ->
-    CurS - TimeS.
-
 %%% ------------------------------------------------------
 %%% Error and progress reporting.
 %%% ------------------------------------------------------
diff --git a/lib/stdlib/src/timer.erl b/lib/stdlib/src/timer.erl
index 72a2dd9616..19d803345e 100644
--- a/lib/stdlib/src/timer.erl
+++ b/lib/stdlib/src/timer.erl
@@ -437,10 +437,8 @@ positive(X) ->
 %%
 %%  system_time() -> time in microseconds
 %%
-system_time() ->    
-    {M,S,U} = erlang:now(),
-    1000000 * (M*1000000 + S) + U.
-
+system_time() ->
+    erlang:monotonic_time(1000000).
 
 send([Pid, Msg]) ->
     Pid ! Msg.
-- 
cgit v1.2.3