aboutsummaryrefslogtreecommitdiffstats
path: root/erts/doc/src
diff options
context:
space:
mode:
Diffstat (limited to 'erts/doc/src')
-rw-r--r--erts/doc/src/erlang.xml358
-rw-r--r--erts/doc/src/notes.xml502
2 files changed, 189 insertions, 671 deletions
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 6ca57566aa..3fea64cef5 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -539,55 +539,94 @@
<name name="cancel_timer" arity="2"/>
<fsummary>Cancel a timer</fsummary>
<desc>
- <p>Cancels a timer. <c><anno>TimerRef</anno></c> needs to refer to
- a timer that was created by either
- <seealso marker="#send_after/4"><c>erlang:send_after()</c></seealso>,
- or <seealso marker="#start_timer/4"><c>erlang:start_timer()</c></seealso>.</p>
- <p>Currently available <c><anno>Option</anno>s</c>:</p>
+ <p>
+ Cancels a timer that has been created by either
+ <seealso marker="#start_timer/4"><c>erlang:start_timer()</c></seealso>,
+ or <seealso marker="#send_after/4"><c>erlang:send_after()</c></seealso>.
+ <c><anno>TimerRef</anno></c> identifies the timer, and
+ was returned by the BIF that created the timer.
+ </p>
+ <p>Currently available <c><anno>Option</anno></c>s:</p>
<taglist>
<tag><c>{async, Async}</c></tag>
<item>
- <p>Asynchronous request for cancellation. <c>Async</c>
- defaults to <c>false</c>. That is the operation will be
- performed synchronously. When <c>Async</c> is set to
- <c>true</c> the cancel operation will be performed
- asynchronously. That is, <c>cancel_timer()</c> will send
- a request for cancellation to the timer service that
- manages the timer, and then return <c>ok</c>.</p></item>
+ <p>
+ Asynchronous request for cancellation. <c>Async</c>
+ defaults to <c>false</c> which will cause the
+ cancellation to be performed synchronously. When
+ <c>Async</c> is set to <c>true</c>, the cancel
+ operation will be performed asynchronously. That is,
+ <c>erlang:cancel_timer()</c> will send an asynchronous
+ request for cancellation to the timer service that
+ manages the timer, and then return <c>ok</c>.
+ </p>
+ </item>
<tag><c>{info, Info}</c></tag>
<item>
- <p>Request information about the <c>Result</c> of the
- cancellation. <c>Info</c> defaults to <c>true</c>. That
- is information will be given. When <c>Info</c> is set to
- <c>false</c> no information about the result of the cancel
- operation will be given. When the operation is performed
- synchronously the <c>Result</c> will returned from
- <c>cancel_timer()</c>. When the operation is performed
- asynchronously, a message on the form
- <c>{cancel_timer, <anno>TimerRef</anno>, <anno>Result</anno>}</c>
- will be sent to the caller of <c>cancel_timer()</c> when
- the operation has been performed.</p></item>
+ <p>
+ Request information about the <c><anno>Result</anno></c>
+ of the cancellation. <c>Info</c> defaults to <c>true</c>
+ which means that the <c><anno>Result</anno></c> will
+ be given. When <c>Info</c> is set to <c>false</c>, no
+ information about the result of the cancellation
+ will be given. When the operation is performed</p>
+ <taglist>
+ <tag>synchronously</tag>
+ <item>
+ <p>
+ If <c>Info</c> is <c>true</c>, the <c>Result</c> will
+ returned by <c>erlang:cancel_timer()</c>; otherwise,
+ <c>ok</c> will be returned.
+ </p>
+ </item>
+ <tag>asynchronously</tag>
+ <item>
+ <p>
+ If <c>Info</c> is <c>true</c>, a message on the form
+ <c>{cancel_timer, <anno>TimerRef</anno>,
+ <anno>Result</anno>}</c> will be sent to the
+ caller of <c>erlang:cancel_timer()</c> when the
+ cancellation operation has been performed; otherwise,
+ no message will be sent.
+ </p>
+ </item>
+ </taglist>
+ </item>
</taglist>
- <p>When the <c><anno>Result</anno></c> equals <c>false</c> a timer
- corresponding to <c><anno>TimerRef</anno></c> could not be found. This
- can be either because the timer had expired, been canceled, or because
- <c><anno>TimerRef</anno></c> do not correspond to a timer. When the
- <c><anno>Result</anno></c> is an integer, it represents
- the time in milli seconds left before the timer will expire.</p>
- <note><p>The timer service that manages the timer may be co-located
- with another scheduler than the scheduler that the calling process
- is executing on. In this case communication with the timer
- service will be performed using asynchronous signals. If the calling
- process is in critical path and can do other things while waiting
- for the result of this operation, you want to use the <c>{async, true}</c>
- option.</p></note>
+ <p>
+ More <c><anno>Option</anno></c>s may be added in the future.
+ </p>
+ <p>
+ When the <c><anno>Result</anno></c> equals <c>false</c>, a
+ timer corresponding to <c><anno>TimerRef</anno></c> could not
+ be found. This can be either because the timer had expired,
+ already had been canceled, or because <c><anno>TimerRef</anno></c>
+ never has corresponded to a timer. If the timer has expired,
+ the timeout message has been sent, but it does not tell you
+ whether or not it has arrived at its destination yet. When the
+ <c><anno>Result</anno></c> is an integer, it represents the
+ time in milli-seconds left until the timer will expire.
+ </p>
+ <note>
+ <p>
+ The timer service that manages the timer may be co-located
+ with another scheduler than the scheduler that the calling
+ process is executing on. If this is the case, communication
+ with the timer service will take much longer time than if it
+ is located locally. If the calling process is in critical
+ path, and can do other things while waiting for the result
+ of this operation, or is not interested in the result of
+ the operation, you want to use the <c>{async, true}</c>
+ option. If using the <c>{async, false}</c> option, the calling
+ process will be blocked until the operation has been
+ performed.
+ </p>
+ </note>
<p>See also
<seealso marker="#send_after/4"><c>erlang:send_after/4</c></seealso>,
<seealso marker="#start_timer/4"><c>erlang:start_timer/4</c></seealso>,
and
<seealso marker="#read_timer/2"><c>erlang:read_timer/2</c></seealso>.</p>
- <p>Note: Cancelling a timer does not guarantee that the message
- has not already been delivered to the message queue.</p>
</desc>
</func>
<func>
@@ -596,7 +635,7 @@
<desc>
<p>Cancels a timer. The same as calling
<seealso marker="#cancel_timer/2"><c>erlang:cancel_timer(TimerRef,
- [{async, false}, {info, true}])</c></seealso>.</p>
+ [])</c></seealso>.</p>
</desc>
</func>
<func>
@@ -4548,37 +4587,60 @@ os_prompt% </pre>
<name name="read_timer" arity="2"/>
<fsummary>Read the state of a timer</fsummary>
<desc>
- <p>Read the state of a timer. <c><anno>TimerRef</anno></c>
- needs to refer to a timer that was created by either
- <seealso marker="#send_after/4"><c>erlang:send_after()</c></seealso>,
- or <seealso marker="#start_timer/4"><c>erlang:start_timer()</c></seealso>.</p>
+ <p>
+ Read the state of a timer that has been created by either
+ <seealso marker="#start_timer/4"><c>erlang:start_timer()</c></seealso>,
+ or <seealso marker="#send_after/4"><c>erlang:send_after()</c></seealso>.
+ <c><anno>TimerRef</anno></c> identifies the timer, and
+ was returned by the BIF that created the timer.
+ </p>
<p>Currently available <c><anno>Option</anno>s</c>:</p>
<taglist>
<tag><c>{async, Async}</c></tag>
<item>
- <p>Asynchronous request. <c>Async</c> defaults to <c>false</c>. That
- is the operation will be performed synchronously, and the <c>Result</c>
- will returned from <c>read_timer()</c>. When <c>Async</c> is set to
- <c>true</c>, <c>read_timer()</c> will send a request for the
- <c>Result</c> to a timer service that manages the timer and then
- return <c>ok</c>. A message on the format
- <c>{read_timer, <anno>TimerRef</anno>, <anno>Result</anno>}</c>
- will be sent to the caller of <c>read_timer()</c> when
- the operation has been processed.</p></item>
+ <p>
+ Asynchronous request for state information. <c>Async</c>
+ defaults to <c>false</c> which will cause the operation
+ to be performed synchronously. In this case, the <c>Result</c>
+ will be returned by <c>erlang:read_timer()</c>. When
+ <c>Async</c> is set to <c>true</c>, <c>erlang:read_timer()</c>
+ will send an asynchronous request for the state information
+ to the timer service that manages the timer, and then return
+ <c>ok</c>. A message on the format <c>{read_timer,
+ <anno>TimerRef</anno>, <anno>Result</anno>}</c> will be
+ sent to the caller of <c>erlang:read_timer()</c> when the
+ operation has been processed.
+ </p>
+ </item>
</taglist>
- <p>When the <c><anno>Result</anno></c> equals <c>false</c> a timer
- corresponding to <c><anno>TimerRef</anno></c> could not be found. This
- can be either because the timer had expired, been canceled, or because
- <c><anno>TimerRef</anno></c> do not correspond to a timer. When the
- <c><anno>Result</anno></c> is an integer, it represents
- the time in milli seconds left before the timer will expire.</p>
- <note><p>The timer service that manages the timer may be co-located
- with another scheduler than the scheduler that the calling process
- is executing on. In this case communication with the timer
- service will be performed using asynchronous signals. If the calling
- process is in critical path and can do other things while waiting
- for the result of this operation, you want to use the <c>{async, true}</c>
- option.</p></note>
+ <p>
+ More <c><anno>Option</anno></c>s may be added in the future.
+ </p>
+ <p>
+ When the <c><anno>Result</anno></c> equals <c>false</c>, a
+ timer corresponding to <c><anno>TimerRef</anno></c> could not
+ be found. This can be either because the timer had expired,
+ had been canceled, or because <c><anno>TimerRef</anno></c>
+ never has corresponded to a timer. If the timer has expired,
+ the timeout message has been sent, but it does not tell you
+ whether or not it has arrived at its destination yet. When the
+ <c><anno>Result</anno></c> is an integer, it represents the
+ time in milli-seconds left until the timer will expire.
+ </p>
+ <note>
+ <p>
+ The timer service that manages the timer may be co-located
+ with another scheduler than the scheduler that the calling
+ process is executing on. If this is the case, communication
+ with the timer service will take much longer time than if it
+ is located locally. If the calling process is in critical
+ path, and can do other things while waiting for the result
+ of this operation you want to use the <c>{async, true}</c>
+ option. If using the <c>{async, false}</c> option, the calling
+ process will be blocked until the operation has been
+ performed.
+ </p>
+ </note>
<p>See also
<seealso marker="#send_after/4"><c>erlang:send_after/4</c></seealso>,
<seealso marker="#start_timer/4"><c>erlang:start_timer/4</c></seealso>,
@@ -4592,7 +4654,7 @@ os_prompt% </pre>
<desc>
<p>Read the state of a timer. The same as calling
<seealso marker="#read_timer/2"><c>erlang:read_timer(TimerRef,
- [{async, false}])</c></seealso>.</p>
+ [])</c></seealso>.</p>
</desc>
</func>
<func>
@@ -4744,48 +4806,14 @@ true</pre>
<name name="send_after" arity="4"/>
<fsummary>Start a timer</fsummary>
<desc>
- <p>Starts a timer. When the timer expires, the message
- <c><anno>Msg</anno></c> will be sent to
- <c><anno>Dest</anno></c>.</p>
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c> it has to
- be a <c>pid()</c> of a local process, dead or alive.</p>
- <p>Currently available <c><anno>Option</anno>s</c>:</p>
- <taglist>
- <tag><c>{abs, Abs}</c></tag>
- <item>
- <p>Absolute timeout. When <c>Abs</c> is <c>false</c>
- the <c><anno>Time</anno></c> value will be interpreted
- as a time in milli-seconds relative current
- <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang
- monotonic time</seealso>. When <c>Abs</c> is <c>true</c> the
- <c><anno>Time</anno></c> value will be interpreted as an absolute
- Erlang monotonic time of milli second time unit. <c>Abs</c>
- defaults to <c>false</c>.</p>
- </item>
- </taglist>
- <p>The absolute time when the timer is set to expire needs
- to be in the range between
- <seealso marker="#system_info_start_time"><c>erlang:system_info(start_time)</c></seealso>
- and
- <seealso marker="#system_info_end_time"><c>erlang:system_info(end_time)</c></seealso>.
- If a negative relative time is specified the time is not
- allowed to be negative.</p>
- <p>If <c><anno>Dest</anno></c> is an <c>atom()</c>, it is supposed to be the name of
- a registered process. The process referred to by the name is
- looked up at the time of delivery. No error is given if
- the name does not refer to a process.</p>
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c>, the timer will be automatically
- canceled if the process referred to by the <c>pid()</c> is not alive,
- or when the process exits. This feature was introduced in
- erts version 5.4.11. Note that timers will not be
- automatically canceled when <c><anno>Dest</anno></c> is an <c>atom()</c>.</p>
- <p>See also
- <seealso marker="#start_timer/4"><c>erlang:send_timer/4</c></seealso>,
- <seealso marker="#cancel_timer/2"><c>erlang:cancel_timer/2</c></seealso>,
- and
- <seealso marker="#read_timer/2"><c>erlang:read_timer/2</c></seealso>.</p>
- <p>Failure: <c>badarg</c> if the arguments does not satisfy
- the requirements specified above.</p>
+ <p>
+ Starts a timer. When the timer expires, the message
+ <c><anno>Msg</anno></c> will be sent to the process
+ identified by <c><anno>Dest</anno></c>. Appart from
+ the format of the message sent to
+ <c><anno>Dest</anno></c> when the timer expires
+ <c>erlang:send_after/4</c> works exactly as
+ <seealso marker="#start_timer/4"><c>erlang:start_timer/4</c></seealso>.</p>
</desc>
</func>
<func>
@@ -4793,36 +4821,8 @@ true</pre>
<fsummary>Start a timer</fsummary>
<desc>
<p>Starts a timer. The same as calling
- <seealso marker="#send_timer/4"><c>erlang:send_after(<anno>Time</anno>,
- <anno>Dest</anno>, <anno>Msg</anno>, [{abs, false}])</c></seealso>.</p>
- </desc>
- </func>
- <func>
- <name name="send_after" arity="3"/>
- <type_desc variable="Time">0 &lt;= Time &lt;= 4294967295</type_desc>
- <fsummary>Start a timer</fsummary>
- <desc>
- <p>Starts a timer which will send the message <c>Msg</c>
- to <c><anno>Dest</anno></c> after <c><anno>Time</anno></c> milliseconds.</p>
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c> it has to be a <c>pid()</c> of a local process, dead or alive.</p>
- <p>The <c><anno>Time</anno></c> value can, in the current implementation, not be greater than 4294967295.</p>
- <p>If <c><anno>Dest</anno></c> is an <c>atom()</c>, it is supposed to be the name of
- a registered process. The process referred to by the name is
- looked up at the time of delivery. No error is given if
- the name does not refer to a process.</p>
-
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c>, the timer will be automatically
- canceled if the process referred to by the <c>pid()</c> is not alive,
- or when the process exits. This feature was introduced in
- erts version 5.4.11. Note that timers will not be
- automatically canceled when <c><anno>Dest</anno></c> is an <c>atom</c>.</p>
- <p>See also
- <seealso marker="#start_timer/3">erlang:start_timer/3</seealso>,
- <seealso marker="#cancel_timer/2">erlang:cancel_timer/2</seealso>,
- and
- <seealso marker="#read_timer/2">erlang:read_timer/2</seealso>.</p>
- <p>Failure: <c>badarg</c> if the arguments does not satisfy
- the requirements specified above.</p>
+ <seealso marker="#send_after/4"><c>erlang:send_after(<anno>Time</anno>,
+ <anno>Dest</anno>, <anno>Msg</anno>, [])</c></seealso>.</p>
</desc>
</func>
<func>
@@ -5231,41 +5231,59 @@ true</pre>
<name name="start_timer" arity="4"/>
<fsummary>Start a timer</fsummary>
<desc>
- <p>Starts a timer. When the timer expires, the message
+ <p>
+ Starts a timer. When the timer expires, the message
<c>{timeout, <anno>TimerRef</anno>, <anno>Msg</anno>}</c>
- will be sent to <c><anno>Dest</anno></c>.</p>
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c> it has to
- be a <c>pid()</c> of a local process, dead or alive.</p>
- <p>Currently available <c><anno>Option</anno>s</c>:</p>
+ will be sent to the process identified by
+ <c><anno>Dest</anno></c>.
+ </p>
+ <p>Currently available <c><anno>Option</anno></c>s:</p>
<taglist>
<tag><c>{abs, Abs}</c></tag>
<item>
- <p>Absolute timeout. When <c>Abs</c> is <c>false</c>
- the <c><anno>Time</anno></c> value will be interpreted
- as a time in milli-seconds relative current
- <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang
- monotonic time</seealso>. When <c>Abs</c> is <c>true</c> the
- <c><anno>Time</anno></c> value will be interpreted as an absolute
- Erlang monotonic time of milli second time unit. <c>Abs</c>
- defaults to <c>false</c>.</p>
+ <p>
+ Absolute <c><anno>Time</anno></c> value. <c>Abs</c>
+ defaults to <c>false</c> which means that the
+ <c><anno>Time</anno></c> value will be interpreted
+ as a time in milli-seconds relative current
+ <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang
+ monotonic time</seealso>. When <c>Abs</c> is set to
+ <c>true</c>, the <c><anno>Time</anno></c> value will
+ be interpreted as an absolute Erlang monotonic time of
+ milli-seconds
+ <seealso marker="#type_time_unit">time unit</seealso>.
+ </p>
</item>
</taglist>
- <p>The absolute time when the timer is set to expire needs
- to be in the range between
- <seealso marker="#system_info_start_time"><c>erlang:system_info(start_time)</c></seealso>
- and
- <seealso marker="#system_info_end_time"><c>erlang:system_info(end_time)</c></seealso>.
- If a negative relative time is specified the time is not
- allowed to be negative.</p>
- <p>If <c><anno>Dest</anno></c> is an <c>atom()</c>, it is supposed to be the name of
- a registered process. The process referred to by the name is
- looked up at the time of delivery. No error is given if
- the name does not refer to a process.</p>
- <p>If <c><anno>Dest</anno></c> is a <c>pid()</c>, the timer will be automatically
- canceled if the process referred to by the <c>pid()</c> is not alive,
- or when the process exits. This feature was introduced in
- erts version 5.4.11. Note that timers will not be
- automatically canceled when <c><anno>Dest</anno></c> is an <c>atom()</c>.</p>
+ <p>
+ More <c><anno>Option</anno></c>s may be added in the future.
+ </p>
+ <p>
+ The absolute point in time that the timer is set to expire on
+ has to be in the interval
+ <c>[</c><seealso marker="#system_info_start_time"><c>erlang:system_info(start_time)</c></seealso><c>,
+ </c><seealso marker="#system_info_end_time"><c>erlang:system_info(end_time)</c></seealso><c>]</c>.
+ Further, if a relative time is specified, the <c><anno>Time</anno></c> value
+ is not allowed to be negative.
+ </p>
+ <p>
+ If <c><anno>Dest</anno></c> is a <c>pid()</c>, it has to
+ be a <c>pid()</c> of a process created on the current
+ runtime system instance. This process may or may not
+ have terminated. If <c><anno>Dest</anno></c> is an
+ <c>atom()</c>, it will be interpreted as the name of a
+ locally registered process. The process referred to by the
+ name is looked up at the time of timer expiration. No error
+ is given if the name does not refer to a process.
+ </p>
+ <p>
+ If <c><anno>Dest</anno></c> is a <c>pid()</c>, the timer will
+ be automatically canceled if the process referred to by the
+ <c>pid()</c> is not alive, or when the process exits. This
+ feature was introduced in erts version 5.4.11. Note that
+ timers will not be automatically canceled when
+ <c><anno>Dest</anno></c> is an <c>atom()</c>.
+ </p>
<p>See also
<seealso marker="#send_after/4"><c>erlang:send_after/4</c></seealso>,
<seealso marker="#cancel_timer/2"><c>erlang:cancel_timer/2</c></seealso>,
@@ -5281,7 +5299,7 @@ true</pre>
<desc>
<p>Starts a timer. The same as calling
<seealso marker="#start_timer/4"><c>erlang:start_timer(<anno>Time</anno>,
- <anno>Dest</anno>, <anno>Msg</anno>, [{abs, false}])</c></seealso>.</p>
+ <anno>Dest</anno>, <anno>Msg</anno>, [])</c></seealso>.</p>
</desc>
</func>
<func>
@@ -6845,7 +6863,9 @@ ok
<item><p>The <seealso marker="#monotonic_time/0">Erlang monotonic
time</seealso> in <c>native</c>
<seealso marker="#type_time_unit">time unit</seealso> at the
- time when current Erlang runtime system instance started.</p></item>
+ time when current Erlang runtime system instance started. See also
+ <seealso marker="#system_info_end_time"><c>erlang:system_info(end_time)</c></seealso>.
+ </p></item>
<tag><c>system_version</c></tag>
<item>
<p>Returns a string containing version number and
diff --git a/erts/doc/src/notes.xml b/erts/doc/src/notes.xml
index c85cbe543d..35e6e55e72 100644
--- a/erts/doc/src/notes.xml
+++ b/erts/doc/src/notes.xml
@@ -30,508 +30,6 @@
</header>
<p>This document describes the changes made to the ERTS application.</p>
-<section><title>Erts 7.0</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
- <list>
- <item>
- <p>
- Fix issuing with spaces and quoting in the arguments when
- using erlang:open_port spawn_executable on windows. The
- behavior now mimics how unix works. This change implies a
- backwards incompatibility for how spawn_executable works
- on windows.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-11905</p>
- </item>
- <item>
- <p>
- Fix global call trace when hipe compiled code call beam
- compiled functions. Tracing of beam functions should now
- alway work regardless who the caller is.</p>
- <p>
- Own Id: OTP-11939</p>
- </item>
- <item>
- <p>
- Correct cache alignment for ETS <c>write_concurrency</c>
- locks to improve performance by reduced false sharing.
- May increase memory footprint for tables with
- <c>write_concurrency</c>.</p>
- <p>
- Own Id: OTP-11974</p>
- </item>
- <item>
- <p>
- All possibly blocking operations in the fd/spawn and
- terminal driver have been converted to non-blocking
- operations. Before this fix it was possible for the VM to
- be blocked for a long time if the entity consuming
- stdout/stderr did not consume it fast enough.</p>
- <p>
- Own Id: OTP-12239</p>
- </item>
- <item>
- <p>
- Add missing overhead for offheap binaries created from
- external format. This fix can improve the garbage
- collection of large binaries originating from
- <c>binary_to_term</c> or messages from remote nodes.</p>
- <p>
- Own Id: OTP-12554</p>
- </item>
- <item>
- <p>
- Ensure hashing of zero is consistent</p>
- <p> Erlang treats positive and negative zero as
- equal:</p>
- <p>
- <c>true = 0.0 =:= 0.0/-1</c></p>
- <p>However, Erlangs hash functions: hash, phash and
- phash2 did not reflect this behaviour. The hash values
- produced by the different hash functions would not be
- identical for positive and negative zero.</p> <p>This
- change ensures that hash value of positive zero is always
- produced regardless of the signedness of the zero float,
- i.e.,</p>
- <p>
- <c>true = erlang:phash2(0.0) =:=
- erlang:phash2(0.0/-1)</c></p>
- <p>
- Own Id: OTP-12641</p>
- </item>
- <item>
- <p>
- Ensure NIF term creation disallows illegal floating point
- values and too long atoms. Such values will cause a NIF
- to throw badarg exception when it returns.</p>
- <p>
- Own Id: OTP-12655</p>
- </item>
- <item>
- <p>
- Fixed building of Map results from match_specs</p>
- <p>
- A faulty "box-value" entered into the heap which could
- cause a segmentation fault in the garbage collector if it
- was written on a heap fragment.</p>
- <p>
- Own Id: OTP-12656</p>
- </item>
- <item>
- <p>
- Fix hipe bug when matching a "writable" binary. The bug
- has been seen to sometimes cause a failed binary matching
- of a correct utf8 character, but other symptoms are also
- possible.</p>
- <p>
- Own Id: OTP-12667</p>
- </item>
- <item>
- <p>
- Keep dirty schedulers from waking other schedulers.</p>
- <p>
- Own Id: OTP-12685</p>
- </item>
- <item>
- <p>
- Disable floating point exceptions if the VM is compiled
- by clang/llvm. This is a known long-standing problem in
- clang/llvm.</p>
- <p>
- Own Id: OTP-12717</p>
- </item>
- <item>
- <p>
- Fix bug in <c>file:sendfile</c> for FreeBSD causing not
- the entire file to be sent.</p>
- <p>
- Own Id: OTP-12720</p>
- </item>
- </list>
- </section>
-
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Add <c>md5</c> and <c>module</c> entries to
- <c>?MODULE:module_info/0/1</c> and remove obsolete entry
- 'import'.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-11940</p>
- </item>
- <item>
- <p>
- Debug function <c>erlang:display/1</c> shows content of
- binaries and bitstrings, not only the length.</p>
- <p>
- Own Id: OTP-11941</p>
- </item>
- <item>
- <p>The time functionality of Erlang has been extended.
- This both includes a <seealso
- marker="time_correction#The_New_Time_API">new
- API</seealso> for time, as well as <seealso
- marker="time_correction#Time_Warp_Modes">time warp
- modes</seealso> which alters the behavior of the system
- when system time changes. <em>You are strongly encouraged
- to use the new API</em> instead of the old API based on
- <seealso
- marker="erlang#now/0"><c>erlang:now/0</c></seealso>.
- <c>erlang:now/0</c> has been deprecated since it is and
- forever will be a scalability bottleneck. For more
- information see the <seealso
- marker="time_correction">Time and Time
- Correction</seealso> chapter of the ERTS User's
- Guide.</p>
- <p>Besides the API changes and time warp modes a lot of
- scalability and performance improvements regarding time
- management has been made internally in the runtime
- system. Examples of such improvements are scheduler
- specific timer wheels, scheduler specific BIF timer
- management, parallel retrieval of monotonic time and
- system time on systems with primitives that are not
- buggy.</p>
- <p>
- Own Id: OTP-11997</p>
- </item>
- <item>
- <p><c>erlang:function_exported(M, F, A)</c> will now
- return <c>true</c> if <c>M:F/A</c> refers to a BIF.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12099</p>
- </item>
- <item>
- <p>
- New BIF: <c>erlang:get_keys/0</c>, lists all keys
- associated with the process dictionary. Note:
- <c>erlang:get_keys/0</c> is auto-imported.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12151 Aux Id: seq12521 </p>
- </item>
- <item>
- <p>
- Make distributed send of large messages yield to improve
- real-time characteristics.</p>
- <p>
- Own Id: OTP-12232</p>
- </item>
- <item>
- <p>
- Use high accuracy poll timeouts</p>
- <p>
- Where available, use poll/select API's that can handle
- time resolutions less than 1ms. In the cases where such
- API's are not available the timeout is rounded up to the
- nearest ms.</p>
- <p>
- Own Id: OTP-12236</p>
- </item>
- <item>
- <p>
- The internal group to user_drv protocol has been changed
- to be synchronous in order to guarantee that output sent
- to a process implementing the user_drv protocol is
- printed before replying. This protocol is used by the
- standard_output device and the ssh application when
- acting as a client. </p>
- <p>
- This change changes the previous unlimited buffer when
- printing to standard_io and other devices that end up in
- user_drv to 1KB.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12240</p>
- </item>
- <item>
- <p>The previously introduced "eager check I/O" feature is
- now enabled by default.</p>
- <p>Eager check I/O can be disabled using the <c>erl</c>
- command line argument: <seealso
- marker="erl#+secio"><c>+secio false</c></seealso></p>
- <p>Characteristics impact compared to previous
- default:</p> <list> <item>Lower latency and smoother
- management of externally triggered I/O operations.</item>
- <item>A slightly reduced priority of externally triggered
- I/O operations.</item> </list>
- <p>
- Own Id: OTP-12254 Aux Id: OTP-12117 </p>
- </item>
- <item>
- <p>
- Properly support maps in match_specs</p>
- <p>
- Own Id: OTP-12270</p>
- </item>
- <item>
- <p>
- The notice that a crashdump has been written has been
- moved to be printed before the crashdump is generated
- instead of afterwords. The wording of the notice has also
- been changed.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12292</p>
- </item>
- <item>
- <p>
- New function <c>ets:take/2</c>. Works the same as
- <c>ets:delete/2</c> but also returns the deleted
- object(s).</p>
- <p>
- Own Id: OTP-12309</p>
- </item>
- <item>
- <p>
- Tracing with cpu_timestamp option has been enabled on
- Linux.</p>
- <p>
- Own Id: OTP-12366</p>
- </item>
- <item>
- <p>
- ets:info/1,2 now contains information about whether
- write_concurrency or read_concurrency is enabled.</p>
- <p>
- Own Id: OTP-12376</p>
- </item>
- <item>
- <p>
- Improved usage of <c>gcc</c>'s builtins for atomic memory
- access. These are used when no other implementation of
- atomic memory operations is available. For example, when
- compiling for ARM when <c>libatomic_ops</c> is not
- available.</p>
- <p>
- The largest improvement will be seen when compiling with
- a <c>gcc</c> with support for the <c>__atomic_*</c>
- builtins (using a <c>gcc</c> of at least version 4.7),
- but also when only the legacy <c>__sync_*</c> builtins
- are available (using a <c>gcc</c> of at least version
- 4.1) an improvement can be seen.</p>
- <p>
- For more information see the "<seealso
- marker="doc/installation_guide:INSTALL#Advanced-configuration-and-build-of-ErlangOTP_Configuring_Atomic-Memory-Operations-and-the-VM">Atomic
- Memory Operations and the VM</seealso>" section of
- <c>$ERL_TOP/HOWTO/INSTALL.md</c>.</p>
- <p>
- Own Id: OTP-12383</p>
- </item>
- <item>
- <p>
- Introduce <c>math:log2/1</c> function to math module.</p>
- <p>
- Own Id: OTP-12411</p>
- </item>
- <item>
- <p>
- Remove perfctr support</p>
- <p>
- Development of perfctr in the linux kernel ceased in
- 2010. The perfctr support code in the Erlang VM is thus
- effectively dead code and therefor removed.</p>
- <p>
- Own Id: OTP-12508</p>
- </item>
- <item>
- <p><c>zlib:inflateChunk/2</c> has been added. It works
- like <c>zlib:inflate/2</c>, but decompresses no more data
- than will fit in the buffer configured by
- <c>zlib:setBufSize/2</c>.</p>
- <p>
- Own Id: OTP-12548</p>
- </item>
- <item>
- <p>
- Use linear search for small select_val arrays</p>
- <p>
- Own Id: OTP-12555</p>
- </item>
- <item>
- <p>
- New BIF ets:update_counter/4 with a default object as
- argument, which will be inserted in the table if the key
- was not found.</p>
- <p>
- Own Id: OTP-12563</p>
- </item>
- <item>
- <p>
- Export missing types from zlib module</p>
- <p>
- Own Id: OTP-12584</p>
- </item>
- <item>
- <p>
- Use persistent hashmaps for large Maps <p>Maps will use a
- persistent hashmap implementation when the number of
- pairs in a Map becomes sufficiently large. The change
- will occur when a Map reaches 33 pairs in size but this
- limit might change in the future.</p></p>
- <p>The most significant impact for the user by this
- change is speed, and to a lesser degree memory
- consumption and introspection of Maps. Memory consumption
- size is probalistic but lesser than <c>gb_trees</c> or
- <c>dict</c> for instance. Any other impacts will be
- transparent for the user except for the following
- changes.</p>
- <p>Semantics of Maps have changed in two incompatible
- ways compared to the experimental implementation in OTP
- 17:</p> <list> <item>Hashing of maps is done different by
- <c>erlang:phash2/1,2</c>, <c>erlang:phash/1</c> and
- <c>erlang:hash/2</c>.</item> <item>Comparing two maps
- with ==, /=, =&lt;, &lt;, &gt;= and &gt;, is done
- different if the keys contain floating point
- numbers.</item> </list>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12585</p>
- </item>
- <item>
- <p>
- Scalability improvement for <seealso
- marker="erlang#make_ref/0">erlang:make_ref/0</seealso>,
- and other functionality that create references. Each
- scheduler now manage its own set of references. By this
- no communication at all is needed when creating
- references.</p>
- <p>
- Previous implementation generated a strictly
- monotonically increasing sequence of references
- corresponding to creation time on the runtime system
- instance. This is <em>not</em> the case with current
- implementation. You can only expect reference to be
- unique. The Erlang/OTP documentation has never mentioned
- anything else but the uniqueness property, so this change
- <em>is</em> fully compatible. The only reason we've
- marked this as a potential incompatibility is since an
- early draft for an Erlang specification mentions strict
- monotonicity as a property.</p>
- <p>
- If you need to create data with a strict monotonicity
- property use <seealso
- marker="erlang#unique_integer/1">erlang:unique_integer([monotonic])</seealso>.
- Do <em>not</em> use the deprecated <seealso
- marker="erlang:now/0">erlang:now()</seealso>.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-12610</p>
- </item>
- <item>
- <p>
- Enable different abort signal from heart</p>
- <p>By using environment variable HEART_KILL_SIGNAL, heart
- can now use a different signal to kill the old running
- Erlang.</p>
- <p>By default the signal is SIGKILL but SIGABRT may also
- be used by setting environment variable:
- HEART_KILL_SIGNAL=SIGABRT</p>
- <p>
- Own Id: OTP-12613 Aux Id: seq12826 </p>
- </item>
- <item>
- <p>
- Update autconf to latest version 2015-03-04</p>
- <p>
- Own Id: OTP-12646</p>
- </item>
- <item>
- <p>
- Optimization of timers internally in the VM. This include
- process timers (<c>receive ... after</c>), port timers
- (<c>driver_set_timer()</c>) as well as BIF timers
- (<c>erlang:send_after()</c>/<c>erlang:start_timer()</c>).</p>
- <p>
- Each scheduler thread now has its own lock-free timer
- service instead of one locked central service. This
- dramatically improves performance of timer management on
- systems with a large amount of schedulers and timers.</p>
- <p>
- The timer service internal data structure has also been
- optimized to be able to handle more timers than before.
- That is, each timer service is by its self able to handle
- more timers without dramatic performance loss than the
- old centralized timer service.</p>
- <p>
- The API of BIF timers has also been extended. Timeout
- values are for example no longer limited to 32-bit
- integers. For more information see the documentation of
- <seealso
- marker="erlang#start_timer/4"><c>erlang:start_timer/4</c></seealso>,
- <seealso
- marker="erlang#send_after/4"><c>erlang:send_after/4</c></seealso>,
- <seealso
- marker="erlang#cancel_timer/2"><c>erlang:cancel_timer/2</c></seealso>,
- and <seealso
- marker="erlang#read_timer/2"><c>erlang:read_timer/2</c></seealso>.</p>
- <p>
- Own Id: OTP-12650 Aux Id: OTP-11997 </p>
- </item>
- <item>
- <p>
- Specialize instructions from common assembler patterns</p>
- <p>Specialize common instructions of <c>rem</c>,
- <c>band</c>, <c>minus</c> and <c>plus</c> in the beam
- loader. This will reduce the number of fetches and thus
- lessen the instruction dispatch pressure during runtime
- and speed up those operations in some common cases.</p>
- <p>Specialize move patterns from x-registers to the stack
- with a new <c>move_window</c> instruction. This change
- will reduce instruction dispatch pressure.</p>
- <p>
- Own Id: OTP-12690</p>
- </item>
- <item>
- <p>
- Fix cross compilation for Android.</p>
- <p>
- Own Id: OTP-12693</p>
- </item>
- <item>
- <p>
- Fix incorrect use of autoconf macro AC_EGREP_CPP, which
- could cause faulty configuration if run from a path
- containing the string 'yes'.</p>
- <p>
- Own Id: OTP-12706</p>
- </item>
- <item>
- <p>
- Minimal Java version is now 1.6</p>
- <p>
- Own Id: OTP-12718</p>
- </item>
- <item>
- <p>
- Send format and args on process exit to error_logger</p>
- <p>
- Previously, the emulator would generate a whole string
- with values and call the error_logger passing
- <c>"~s~n"</c>. This changes it to a format string
- containing <c>~p</c> with the respective values as
- arguments.</p>
- <p>
- Own Id: OTP-12735</p>
- </item>
- </list>
- </section>
-
-</section>
-
<section><title>Erts 6.4.1</title>
<section><title>Fixed Bugs and Malfunctions</title>