<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE erlref SYSTEM "erlref.dtd"> <erlref> <header> <copyright> <year>1996</year><year>2015</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. </legalnotice> <title>erlang</title> <prepared></prepared> <docno></docno> <date></date> <rev></rev> <file>erlang.xml</file> </header> <module>erlang</module> <modulesummary>The Erlang BIFs.</modulesummary> <description> <p>By convention, most Built-In Functions (BIFs) are seen as being in this module. Some of the BIFs are viewed more or less as part of the Erlang programming language and are <em>auto-imported</em>. Thus, it is not necessary to specify the module name. For example, the calls <c>atom_to_list(Erlang)</c> and <c>erlang:atom_to_list(Erlang)</c> are identical.</p> <p>Auto-imported BIFs are listed without module prefix. BIFs listed with module prefix are not auto-imported.</p> <p>BIFs can fail for various reasons. All BIFs fail with reason <c>badarg</c> if they are called with arguments of an incorrect type. The other reasons are described in the description of each individual BIF.</p> <p>Some BIFs can be used in guard tests and are marked with "Allowed in guard tests".</p> </description> <datatypes> <datatype> <name>ext_binary()</name> <desc> <marker id="type-ext_binary"></marker> <p>A binary data object, structured according to the Erlang external term format.</p> </desc> </datatype> <datatype> <name name="timestamp"></name> <desc><p>See <seealso marker="#timestamp/0">erlang:timestamp/0</seealso>.</p> </desc> </datatype> <datatype> <name name="time_unit"></name> <desc><p><marker id="type_time_unit"/> Supported time unit representations:</p> <taglist> <tag><c>PartsPerSecond :: integer() >= 1</c></tag> <item><p>Time unit expressed in parts per second. That is, the time unit equals <c>1/PartsPerSecond</c> second.</p></item> <tag><c>seconds</c></tag> <item><p>Symbolic representation of the time unit represented by the integer <c>1</c>.</p></item> <tag><c>milli_seconds</c></tag> <item><p>Symbolic representation of the time unit represented by the integer <c>1000</c>.</p></item> <tag><c>micro_seconds</c></tag> <item><p>Symbolic representation of the time unit represented by the integer <c>1000000</c>.</p></item> <tag><c>nano_seconds</c></tag> <item><p>Symbolic representation of the time unit represented by the integer <c>1000000000</c>.</p></item> <tag><c>native</c></tag> <item><p>Symbolic representation of the native time unit used by the Erlang runtime system.</p> <p>The <c>native</c> time unit is determined at runtime system start, and remains the same until the runtime system terminates. If a runtime system is stopped and then started again (even on the same machine), the <c>native</c> time unit of the new runtime system instance can differ from the <c>native</c> time unit of the old runtime system instance.</p> <p>One can get an approximation of the <c>native</c> time unit by calling <c>erlang:convert_time_unit(1, seconds, native)</c>. The result equals the number of whole <c>native</c> time units per second. In case the number of <c>native</c> time units per second does not add up to a whole number, the result is rounded downwards.</p> <note> <p>The value of the <c>native</c> time unit gives you more or less no information at all about the quality of time values. It sets a limit for the <seealso marker="time_correction#Time_Resolution">resolution</seealso> as well as for the <seealso marker="time_correction#Time_Precision">precision</seealso> of time values, but it gives absolutely no information at all about the <seealso marker="time_correction#Time_Accuracy">accuracy</seealso> of time values. The resolution of the <c>native</c> time unit and the resolution of time values can differ significantly.</p> </note> </item> </taglist> <p>The <c>time_unit/0</c> type may be extended. Use <seealso marker="#convert_time_unit/3"><c>erlang:convert_time_unit/3</c></seealso> in order to convert time values between time units.</p> </desc> </datatype> </datatypes> <funcs> <func> <name name="abs" arity="1" clause_i="1"/> <name name="abs" arity="1" clause_i="2"/> <fsummary>Arithmetical absolute value.</fsummary> <type> <v>Float = float()</v> <v>Int = integer()</v> </type> <desc> <p>Returns an integer or float that is the arithmetical absolute value of <c><anno>Float</anno></c> or <c><anno>Int</anno></c>, for example:</p> <pre> > <input>abs(-3.33).</input> 3.33 > <input>abs(-3).</input> 3</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="adler32" arity="1"/> <fsummary>Computes adler32 checksum.</fsummary> <desc> <p>Computes and returns the adler32 checksum for <c><anno>Data</anno></c>.</p> </desc> </func> <func> <name name="adler32" arity="2"/> <fsummary>Computes adler32 checksum.</fsummary> <desc> <p>Continues computing the adler32 checksum by combining the previous checksum, <c><anno>OldAdler</anno></c>, with the checksum of <c><anno>Data</anno></c>.</p> <p>The following code:</p> <code> X = erlang:adler32(Data1), Y = erlang:adler32(X,Data2).</code> <p>assigns the same value to <c>Y</c> as this:</p> <code> Y = erlang:adler32([Data1,Data2]).</code> </desc> </func> <func> <name name="adler32_combine" arity="3"/> <fsummary>Combines two adler32 checksums.</fsummary> <desc> <p>Combines two previously computed adler32 checksums. This computation requires the size of the data object for the second checksum to be known.</p> <p>The following code:</p> <code> Y = erlang:adler32(Data1), Z = erlang:adler32(Y,Data2).</code> <p>assigns the same value to <c>Z</c> as this:</p> <code> X = erlang:adler32(Data1), Y = erlang:adler32(Data2), Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).</code> </desc> </func> <func> <name name="append_element" arity="2"/> <fsummary>Appends an extra element to a tuple.</fsummary> <desc> <p>Returns a new tuple that has one element more than <c><anno>Tuple1</anno></c>, and contains the elements in <c><anno>Tuple1</anno></c> followed by <c><anno>Term</anno></c> as the last element. Semantically equivalent to <c>list_to_tuple(tuple_to_list(<anno>Tuple1</anno>) ++ [<anno>Term</anno>])</c>, but much faster.</p> <p>Example:</p> <pre> > <input>erlang:append_element({one, two}, three).</input> {one,two,three}</pre> </desc> </func> <func> <name name="apply" arity="2"/> <fsummary>Applies a function to an argument list.</fsummary> <desc> <p>Calls a fun, passing the elements in <c><anno>Args</anno></c> as arguments.</p> <p>If the number of elements in the arguments are known at compile time, the call is better written as <c><anno>Fun</anno>(Arg1, Arg2, ... ArgN)</c>.</p> <warning> <p>Earlier, <c><anno>Fun</anno></c> could also be given as <c>{Module, Function}</c>, equivalent to <c>apply(Module, Function, Args)</c>. This use is deprecated and will stop working in a future release.</p> </warning> </desc> </func> <func> <name name="apply" arity="3"/> <fsummary>Applies a function to an argument list.</fsummary> <desc> <p>Returns the result of applying <c>Function</c> in <c><anno>Module</anno></c> to <c><anno>Args</anno></c>. The applied function must be exported from <c>Module</c>. The arity of the function is the length of <c>Args</c>.</p> <p>Example:</p> <pre> > <input>apply(lists, reverse, [[a, b, c]]).</input> [c,b,a] > <input>apply(erlang, atom_to_list, ['Erlang']).</input> "Erlang"</pre> <p>If the number of arguments are known at compile time, the call is better written as <c><anno>Module</anno>:<anno>Function</anno>(Arg1, Arg2, ..., ArgN)</c>.</p> <p>Failure: <c>error_handler:undefined_function/3</c> is called if the applied function is not exported. The error handler can be redefined (see <seealso marker="#process_flag/2">process_flag/2</seealso>). If <c>error_handler</c> is undefined, or if the user has redefined the default <c>error_handler</c> so the replacement module is undefined, an error with the reason <c>undef</c> is generated.</p> </desc> </func> <func> <name name="atom_to_binary" arity="2"/> <fsummary>Returns the binary representation of an atom.</fsummary> <desc> <p>Returns a binary corresponding to the text representation of <c><anno>Atom</anno></c>. If <c><anno>Encoding</anno></c> is <c>latin1</c>, there is one byte for each character in the text representation. If <c><anno>Encoding</anno></c> is <c>utf8</c> or <c>unicode</c>, the characters are encoded using UTF-8 (that is, characters from 128 through 255 are encoded in two bytes).</p> <note><p><c>atom_to_binary(<anno>Atom</anno>, latin1)</c> never fails because the text representation of an atom can only contain characters from 0 through 255. In a future release, the text representation of atoms can be allowed to contain any Unicode character and <c>atom_to_binary(<anno>Atom</anno>, latin1)</c> will then fail if the text representation for <c><anno>Atom</anno></c> contains a Unicode character greater than 255.</p></note> <p>Example:</p> <pre> > <input>atom_to_binary('Erlang', latin1).</input> <<"Erlang">></pre> </desc> </func> <func> <name name="atom_to_list" arity="1"/> <fsummary>Text representation of an atom.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Atom</anno></c>, for example:</p> <pre> > <input>atom_to_list('Erlang').</input> "Erlang"</pre> </desc> </func> <func> <name name="binary_part" arity="2"/> <fsummary>Extracts a part of a binary.</fsummary> <desc> <p>Extracts the part of the binary described by <c><anno>PosLen</anno></c>.</p> <p>Negative length can be used to extract bytes at the end of a binary, for example:</p> <code> 1> Bin = <<1,2,3,4,5,6,7,8,9,10>>. 2> binary_part(Bin,{byte_size(Bin), -5}). <<6,7,8,9,10>></code> <p>Failure: <c>badarg</c> if <c><anno>PosLen</anno></c> in any way references outside the binary.</p> <p><c><anno>Start</anno></c> is zero-based, that is:</p> <code> 1> Bin = <<1,2,3>> 2> binary_part(Bin,{0,2}). <<1,2>></code> <p>For details about the <c><anno>PosLen</anno></c> semantics, see the <seealso marker="stdlib:binary">binary</seealso> manual page in <c>STDLIB</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="binary_part" arity="3"/> <fsummary>Extracts a part of a binary.</fsummary> <desc> <p>The same as <c>binary_part(<anno>Subject</anno>, {<anno>Start</anno>, <anno>Length</anno>})</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="binary_to_atom" arity="2"/> <fsummary>Converts from text representation to an atom.</fsummary> <desc> <p>Returns the atom whose text representation is <c><anno>Binary</anno></c>. If <c><anno>Encoding</anno></c> is <c>latin1</c>, no translation of bytes in the binary is done. If <c><anno>Encoding</anno></c> is <c>utf8</c> or <c>unicode</c>, the binary must contain valid UTF-8 sequences. Only Unicode characters up to 255 are allowed.</p> <note><p><c>binary_to_atom(<anno>Binary</anno>, utf8)</c> fails if the binary contains Unicode characters greater than 255. In a future release, such Unicode characters can be allowed and <c>binary_to_atom(<anno>Binary</anno>, utf8)</c> does then not fail. For more information on Unicode support in atoms, see the <seealso marker="erl_ext_dist#utf8_atoms">note on UTF-8 encoded atoms</seealso> in Section "External Term Format" in the User's Guide.</p></note> <p>Examples:</p> <pre> > <input>binary_to_atom(<<"Erlang">>, latin1).</input> 'Erlang' > <input>binary_to_atom(<<1024/utf8>>, utf8).</input> ** exception error: bad argument in function binary_to_atom/2 called as binary_to_atom(<<208,128>>,utf8)</pre> </desc> </func> <func> <name name="binary_to_existing_atom" arity="2"/> <fsummary>Converts from text representation to an atom.</fsummary> <desc> <p>As <seealso marker="#binary_to_atom/2">binary_to_atom/2</seealso>, but the atom must exist.</p> <p>Failure: <c>badarg</c> if the atom does not exist.</p> </desc> </func> <func> <name name="binary_to_float" arity="1"/> <fsummary>Converts from text representation to a float.</fsummary> <desc> <p>Returns the float whose text representation is <c><anno>Binary</anno></c>, for example:</p> <pre> > <input>binary_to_float(<<"2.2017764e+0">>).</input> 2.2017764</pre> <p>Failure: <c>badarg</c> if <c><anno>Binary</anno></c> contains a bad representation of a float.</p> </desc> </func> <func> <name name="binary_to_integer" arity="1"/> <fsummary>Converts from text representation to an integer.</fsummary> <desc> <p>Returns an integer whose text representation is <c><anno>Binary</anno></c>, for example:</p> <pre> > <input>binary_to_integer(<<"123">>).</input> 123</pre> <p>Failure: <c>badarg</c> if <c><anno>Binary</anno></c> contains a bad representation of an integer.</p> </desc> </func> <func> <name name="binary_to_integer" arity="2"/> <fsummary>Converts from text representation to an integer.</fsummary> <desc> <p>Returns an integer whose text representation in base <c><anno>Base</anno></c> is <c><anno>Binary</anno></c>, for example:</p> <pre> > <input>binary_to_integer(<<"3FF">>, 16).</input> 1023</pre> <p>Failure: <c>badarg</c> if <c><anno>Binary</anno></c> contains a bad representation of an integer.</p> </desc> </func> <func> <name name="binary_to_list" arity="1"/> <fsummary>Converts a binary to a list.</fsummary> <desc> <p>Returns a list of integers corresponding to the bytes of <c><anno>Binary</anno></c>.</p> </desc> </func> <func> <name name="binary_to_list" arity="3"/> <fsummary>Converts part of a binary to a list.</fsummary> <type_desc variable="Start">1..byte_size(<c><anno>Binary</anno></c>)</type_desc> <desc> <p>As <c>binary_to_list/1</c>, but returns a list of integers corresponding to the bytes from position <c><anno>Start</anno></c> to position <c><anno>Stop</anno></c> in <c><anno>Binary</anno></c>. The positions in the binary are numbered starting from 1.</p> <note><p>The one-based indexing for binaries used by this function is deprecated. New code is to use <seealso marker="stdlib:binary#bin_to_list/3">binary:bin_to_list/3</seealso> in <c>STDLIB</c> instead. All functions in module <c>binary</c> consistently use zero-based indexing.</p></note> </desc> </func> <func> <name name="bitstring_to_list" arity="1"/> <fsummary>Converts a bitstring to a list.</fsummary> <desc> <p>Returns a list of integers corresponding to the bytes of <c><anno>Bitstring</anno></c>. If the number of bits in the binary is not divisible by 8, the last element of the list is a bitstring containing the remaining 1-7 bits.</p> </desc> </func> <func> <name name="binary_to_term" arity="1"/> <fsummary>Decodes an Erlang external term format binary.</fsummary> <desc> <p>Returns an Erlang term that is the result of decoding binary object <c><anno>Binary</anno></c>, which must be encoded according to the Erlang external term format.</p> <warning><p>When decoding binaries from untrusted sources, consider using <c>binary_to_term/2</c> to prevent Denial of Service attacks.</p></warning> <p>See also <seealso marker="#term_to_binary/1">term_to_binary/1</seealso> and <seealso marker="#binary_to_term/2">binary_to_term/2</seealso>.</p> </desc> </func> <func> <name name="binary_to_term" arity="2"/> <fsummary>Decodes an Erlang external term format binary.</fsummary> <desc> <p>As <c>binary_to_term/1</c>, but takes options that affect decoding of the binary.</p> <taglist> <tag><c>safe</c></tag> <item> <p>Use this option when receiving binaries from an untrusted source.</p> <p>When enabled, it prevents decoding data that can be used to attack the Erlang system. In the event of receiving unsafe data, decoding fails with a <c>badarg</c> error.</p> <p>This prevents creation of new atoms directly, creation of new atoms indirectly (as they are embedded in certain structures, such as process identifiers, refs, and funs), and creation of new external function references. None of those resources are garbage collected, so unchecked creation of them can exhaust available memory.</p> </item> </taglist> <p>Failure: <c>badarg</c> if <c>safe</c> is specified and unsafe data is decoded.</p> <p>See also <seealso marker="#term_to_binary/1">term_to_binary/1</seealso>, <seealso marker="#binary_to_term/1">binary_to_term/1</seealso>, and <seealso marker="#list_to_existing_atom/1">list_to_existing_atom/1</seealso>.</p> </desc> </func> <func> <name name="bit_size" arity="1"/> <fsummary>Returns the size of a bitstring.</fsummary> <desc> <p>Returns an integer that is the size in bits of <c><anno>Bitstring</anno></c>, for example:</p> <pre> > <input>bit_size(<<433:16,3:3>>).</input> 19 > <input>bit_size(<<1,2,3>>).</input> 24</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="bump_reductions" arity="1"/> <fsummary>Increments the reduction counter.</fsummary> <desc> <p>This implementation-dependent function increments the reduction counter for the calling process. In the Beam emulator, the reduction counter is normally incremented by one for each function and BIF call. A context switch is forced when the counter reaches the maximum number of reductions for a process (2000 reductions in OTP R12B).</p> <warning> <p>This BIF can be removed in a future version of the Beam machine without prior warning. It is unlikely to be implemented in other Erlang implementations.</p> </warning> </desc> </func> <func> <name name="byte_size" arity="1"/> <fsummary>Returns the size of a bitstring (or binary).</fsummary> <desc> <p>Returns an integer that is the number of bytes needed to contain <c><anno>Bitstring</anno></c>. That is, if the number of bits in <c><anno>Bitstring</anno></c> is not divisible by 8, the resulting number of bytes is rounded <em>up</em>.</p> <p>Examples:</p> <pre> > <input>byte_size(<<433:16,3:3>>).</input> 3 > <input>byte_size(<<1,2,3>>).</input> 3</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="cancel_timer" arity="2"/> <fsummary>Cancels a timer.</fsummary> <desc> <p> Cancels a timer that has been created by <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>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> which will cause the cancellation to be performed synchronously. When <c>Async</c> is set to <c>true</c>, the cancel operation is 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><anno>Result</anno></c> of the cancellation. <c>Info</c> defaults to <c>true</c> which means the <c><anno>Result</anno></c> is given. When <c>Info</c> is set to <c>false</c>, no information about the result of the cancellation is 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> is returned by <c>erlang:cancel_timer()</c>; otherwise, <c>ok</c> is 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> is sent to the caller of <c>erlang:cancel_timer()</c> when the cancellation operation has been performed; otherwise, no message is sent. </p> </item> </taglist> </item> </taglist> <p> More <c><anno>Option</anno></c>s may be added in the future. </p> <p>If <c><anno>Result</anno></c> is an integer, it represents the time in milli-seconds left until the canceled timer would have expired.</p> <p> If <c><anno>Result</anno></c> is <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 corresponded to a timer. Even if the timer had expired, it does not tell you whether or not the timeout message has arrived at its destination yet. </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 takes 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 option <c>{async, true}</c>. If using option <c>{async, false}</c>, the calling process blocks 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> </desc> </func> <func> <name name="cancel_timer" arity="1"/> <fsummary>Cancels a timer.</fsummary> <desc> <p>Cancels a timer. The same as calling <seealso marker="#cancel_timer/2"><c>erlang:cancel_timer(TimerRef, [])</c></seealso>.</p> </desc> </func> <func> <name name="check_old_code" arity="1"/> <fsummary>Checks if a module has old code.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Module</anno></c> has old code, otherwise <c>false</c>.</p> <p>See also <seealso marker="kernel:code">code(3)</seealso>.</p> </desc> </func> <func> <name name="check_process_code" arity="2"/> <fsummary>Checks if a process executes old code for a module.</fsummary> <desc> <p>The same as <seealso marker="#check_process_code/3"><c>erlang:check_process_code(<anno>Pid</anno>, <anno>Module</anno>, [])</c></seealso>.</p> </desc> </func> <func> <name name="check_process_code" arity="3"/> <fsummary>Checks if a process executes old code for a module.</fsummary> <desc> <p>Checks if the node local process identified by <c><anno>Pid</anno></c> executes old code for <c><anno>Module</anno></c>.</p> <p>The available <c><anno>Option</anno></c>s are as follows:</p> <taglist> <tag><c>{allow_gc, boolean()}</c></tag> <item> <p>Determines if garbage collection is allowed when performing the operation. If <c>{allow_gc, false}</c> is passed, and a garbage collection is needed to determine the result of the operation, the operation is aborted (see information on <c><anno>CheckResult</anno></c> in the following). The default is to allow garbage collection, that is, <c>{allow_gc, true}</c>.</p> </item> <tag><c>{async, RequestId}</c></tag> <item> <p>The function <c>check_process_code/3</c> returns the value <c>async</c> immediately after the request has been sent. When the request has been processed, the process that called this function is passed a message on the form <c>{check_process_code, <anno>RequestId</anno>, <anno>CheckResult</anno>}</c>.</p> </item> </taglist> <p>If <c><anno>Pid</anno></c> equals <c>self()</c>, and no <c>async</c> option has been passed, the operation is performed at once. Otherwise a request for the operation is sent to the process identified by <c><anno>Pid</anno></c>, and is handled when appropriate. If no <c>async</c> option has been passed, the caller blocks until <c><anno>CheckResult</anno></c> is available and can be returned.</p> <p><c><anno>CheckResult</anno></c> informs about the result of the request as follows:</p> <taglist> <tag><c>true</c></tag> <item> <p>The process identified by <c><anno>Pid</anno></c> executes old code for <c><anno>Module</anno></c>. That is, the current call of the process executes old code for this module, or the process has references to old code for this module, or the process contains funs that references old code for this module.</p> </item> <tag><c>false</c></tag> <item> <p>The process identified by <c><anno>Pid</anno></c> does not execute old code for <c><anno>Module</anno></c>.</p> </item> <tag><c>aborted</c></tag> <item> <p>The operation was aborted, as the process needed to be garbage collected to determine the operation result, and the operation was requested by passing option <c>{allow_gc, false}</c>.</p></item> </taglist> <p>See also <seealso marker="kernel:code">code(3)</seealso>.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>If <c><anno>Pid</anno></c> is not a node local process identifier. </item> <tag><c>badarg</c></tag> <item>If <c><anno>Module</anno></c> is not an atom. </item> <tag><c>badarg</c></tag> <item>If <c><anno>OptionList</anno></c> is an invalid list of options. </item> </taglist> </desc> </func> <func> <name name="convert_time_unit" arity="3"/> <fsummary>Converts time unit of a time value.</fsummary> <desc> <p>Converts the <c><anno>Time</anno></c> value of time unit <c><anno>FromUnit</anno></c> to the corresponding <c><anno>ConvertedTime</anno></c> value of time unit <c><anno>ToUnit</anno></c>. The result is rounded using the floor function.</p> <warning><p>You may lose accuracy and precision when converting between time units. In order to minimize such loss, collect all data at <c>native</c> time unit and do the conversion on the end result.</p></warning> </desc> </func> <func> <name name="crc32" arity="1"/> <fsummary>Computes crc32 (IEEE 802.3) checksum.</fsummary> <desc> <p>Computes and returns the crc32 (IEEE 802.3 style) checksum for <c><anno>Data</anno></c>.</p> </desc> </func> <func> <name name="crc32" arity="2"/> <fsummary>Computes crc32 (IEEE 802.3) checksum.</fsummary> <desc> <p>Continues computing the crc32 checksum by combining the previous checksum, <c><anno>OldCrc</anno></c>, with the checksum of <c><anno>Data</anno></c>.</p> <p>The following code:</p> <code> X = erlang:crc32(Data1), Y = erlang:crc32(X,Data2).</code> <p>assigns the same value to <c>Y</c> as this:</p> <code> Y = erlang:crc32([Data1,Data2]).</code> </desc> </func> <func> <name name="crc32_combine" arity="3"/> <fsummary>Combines two crc32 (IEEE 802.3) checksums.</fsummary> <desc> <p>Combines two previously computed crc32 checksums. This computation requires the size of the data object for the second checksum to be known.</p> <p>The following code:</p> <code> Y = erlang:crc32(Data1), Z = erlang:crc32(Y,Data2).</code> <p>assigns the same value to <c>Z</c> as this:</p> <code> X = erlang:crc32(Data1), Y = erlang:crc32(Data2), Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).</code> </desc> </func> <func> <name name="date" arity="0"/> <fsummary>Current date.</fsummary> <desc> <p>Returns the current date as <c>{Year, Month, Day}</c>.</p> <p>The time zone and Daylight Saving Time correction depend on the underlying OS.</p> <p>Example:</p> <pre> > <input>date().</input> {1995,2,19}</pre> </desc> </func> <func> <name name="decode_packet" arity="3"/> <fsummary>Extracts a protocol packet from a binary.</fsummary> <desc> <p>Decodes the binary <c><anno>Bin</anno></c> according to the packet protocol specified by <c><anno>Type</anno></c>. Similar to the packet handling done by sockets with option {packet,<anno>Type</anno>}.</p> <p>If an entire packet is contained in <c><anno>Bin</anno></c>, it is returned together with the remainder of the binary as <c>{ok,<anno>Packet</anno>,<anno>Rest</anno>}</c>.</p> <p>If <c><anno>Bin</anno></c> does not contain the entire packet, <c>{more,<anno>Length</anno>}</c> is returned. <c><anno>Length</anno></c> is either the expected <em>total size</em> of the packet, or <c>undefined</c> if the expected packet size is unknown. <c>decode_packet</c> can then be called again with more data added.</p> <p>If the packet does not conform to the protocol format, <c>{error,<anno>Reason</anno>}</c> is returned.</p> <p>The following <c>Type</c>s are valid:</p> <taglist> <tag><c>raw | 0</c></tag> <item> <p>No packet handling is done. The entire binary is returned unless it is empty.</p> </item> <tag><c>1 | 2 | 4</c></tag> <item> <p>Packets consist of a header specifying the number of bytes in the packet, followed by that number of bytes. The length of the header can be one, two, or four bytes; the order of the bytes is big-endian. The header is stripped off when the packet is returned.</p> </item> <tag><c>line</c></tag> <item> <p>A packet is a line terminated by a delimiter byte, default is the latin1 newline character. The delimiter byte is included in the returned packet unless the line was truncated according to option <c>line_length</c>.</p> </item> <tag><c>asn1 | cdr | sunrm | fcgi | tpkt</c></tag> <item> <p>The header is <em>not</em> stripped off.</p> <p>The meanings of the packet types are as follows:</p> <taglist> <tag><c>asn1</c> - ASN.1 BER</tag><item></item> <tag><c>sunrm</c> - Sun's RPC encoding</tag><item></item> <tag><c>cdr</c> - CORBA (GIOP 1.1)</tag><item></item> <tag><c>fcgi</c> - Fast CGI</tag><item></item> <tag><c>tpkt</c> - TPKT format [RFC1006]</tag><item></item> </taglist> </item> <tag><c>http | httph | http_bin | httph_bin</c></tag> <item> <p>The Hypertext Transfer Protocol. The packets are returned with the format according to <c><anno>HttpPacket</anno></c> described earlier. A packet is either a request, a response, a header, or an end of header mark. Invalid lines are returned as <c><anno>HttpError</anno></c>.</p> <p>Recognized request methods and header fields are returned as atoms. Others are returned as strings. Strings of unrecognized header fields are formatted with only capital letters first and after hyphen characters, for example, <c>"Sec-Websocket-Key"</c>.</p> <p>The protocol type <c>http</c> is only to be used for the first line when an <c><anno>HttpRequest</anno></c> or an <c><anno>HttpResponse</anno></c> is expected. The following calls are to use <c>httph</c> to get <c><anno>HttpHeader</anno></c>s until <c>http_eoh</c> is returned, which marks the end of the headers and the beginning of any following message body.</p> <p>The variants <c>http_bin</c> and <c>httph_bin</c> return strings (<c>HttpString</c>) as binaries instead of lists.</p> </item> </taglist> <p>The following options are available:</p> <taglist> <tag><c>{packet_size, integer() >= 0}</c></tag> <item><p>Sets the maximum allowed size of the packet body. If the packet header indicates that the length of the packet is longer than the maximum allowed length, the packet is considered invalid. Default is 0, which means no size limit.</p> </item> <tag><c>{line_length, integer() >= 0}</c></tag> <item><p>For packet type <c>line</c>, lines longer than the indicated length are truncated.</p> <p>Option <c>line_length</c> also applies to <c>http*</c> packet types as an alias for option <c>packet_size</c> if <c>packet_size</c> itself is not set. This use is only intended for backward compatibility.</p> </item> <tag><c>{line_delimiter, 0 =< byte() =< 255}</c></tag> <item><p>For packet type <c>line</c>, sets the delimiting byte. Default is the latin1 character <c>$\n</c>.</p> </item> </taglist> <p>Examples:</p> <pre> > <input>erlang:decode_packet(1,<<3,"abcd">>,[]).</input> {ok,<<"abc">>,<<"d">>} > <input>erlang:decode_packet(1,<<5,"abcd">>,[]).</input> {more,6}</pre> </desc> </func> <func> <name name="delete_element" arity="2"/> <fsummary>Deletes element at index in a tuple.</fsummary> <type_desc variable="Index">1..tuple_size(<anno>Tuple1</anno>)</type_desc> <desc> <p>Returns a new tuple with element at <c><anno>Index</anno></c> removed from tuple <c><anno>Tuple1</anno></c>, for example:</p> <pre> > <input>erlang:delete_element(2, {one, two, three}).</input> {one,three}</pre> </desc> </func> <func> <name name="delete_module" arity="1"/> <fsummary>Makes the current code for a module old.</fsummary> <desc> <p>Makes the current code for <c><anno>Module</anno></c> become old code, and deletes all references for this module from the export table. Returns <c>undefined</c> if the module does not exist, otherwise <c>true</c>.</p> <warning> <p>This BIF is intended for the code server (see <seealso marker="kernel:code">code(3)</seealso>) and is not to be used elsewhere.</p> </warning> <p>Failure: <c>badarg</c> if there already is an old version of <c>Module</c>.</p> </desc> </func> <func> <name name="demonitor" arity="1"/> <fsummary>Stops monitoring.</fsummary> <desc> <p>If <c><anno>MonitorRef</anno></c> is a reference that the calling process obtained by calling <seealso marker="#monitor/2">monitor/2</seealso>, this monitoring is turned off. If the monitoring is already turned off, nothing happens.</p> <p>Once <c>demonitor(<anno>MonitorRef</anno>)</c> has returned, it is guaranteed that no <c>{'DOWN', <anno>MonitorRef</anno>, _, _, _}</c> message, because of the monitor, will be placed in the caller message queue in the future. A <c>{'DOWN', <anno>MonitorRef</anno>, _, _, _}</c> message can have been placed in the caller message queue before the call, though. It is therefore usually advisable to remove such a <c>'DOWN'</c> message from the message queue after monitoring has been stopped. <seealso marker="#demonitor/2"><c>demonitor(<anno>MonitorRef</anno>, [flush])</c></seealso> can be used instead of <c>demonitor(<anno>MonitorRef</anno>)</c> if this cleanup is wanted.</p> <note> <p>Prior to OTP release R11B (ERTS version 5.5) <c>demonitor/1</c> behaved completely asynchronously, i.e., the monitor was active until the "demonitor signal" reached the monitored entity. This had one undesirable effect. You could never know when you were guaranteed <em>not</em> to receive a <c>DOWN</c> message due to the monitor.</p> <p>Current behavior can be viewed as two combined operations: asynchronously send a "demonitor signal" to the monitored entity and ignore any future results of the monitor. </p> </note> <p>Failure: It is an error if <c><anno>MonitorRef</anno></c> refers to a monitoring started by another process. Not all such cases are cheap to check. If checking is cheap, the call fails with <c>badarg</c> for example, if <c><anno>MonitorRef</anno></c> is a remote reference.</p> </desc> </func> <func> <name name="demonitor" arity="2"/> <fsummary>Stops monitoring.</fsummary> <desc> <p>The returned value is <c>true</c> unless <c>info</c> is part of <c><anno>OptionList</anno></c>.</p> <p><c>demonitor(<anno>MonitorRef</anno>, [])</c> is equivalent to <seealso marker="#demonitor/1"><c>demonitor(<anno>MonitorRef</anno>)</c></seealso>.</p> <p>The available <c><anno>Option</anno></c>s are as follows:</p> <taglist> <tag><c>flush</c></tag> <item> <p>Removes (one) <c>{_, <anno>MonitorRef</anno>, _, _, _}</c> message, if there is one, from the caller message queue after monitoring has been stopped.</p> <p>Calling <c>demonitor(<anno>MonitorRef</anno>, [flush])</c> is equivalent to the following, but more efficient:</p> <code type="none"> demonitor(MonitorRef), receive {_, MonitorRef, _, _, _} -> true after 0 -> true end</code> </item> <tag><c>info</c></tag> <item> <p>The returned value is one of the following:</p> <taglist> <tag><c>true</c></tag> <item>The monitor was found and removed. In this case, no <c>'DOWN'</c> message corresponding to this monitor has been delivered and will not be delivered. </item> <tag><c>false</c></tag> <item>The monitor was not found and could not be removed. This probably because someone already has placed a <c>'DOWN'</c> message corresponding to this monitor in the caller message queue. </item> </taglist> <p>If option <c>info</c> is combined with option <c>flush</c>, <c>false</c> is returned if a flush was needed, otherwise <c>true</c>.</p> </item> </taglist> <note> <p>More options can be added in a future release.</p> </note> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>If <c><anno>OptionList</anno></c> is not a list. </item> <tag><c>badarg</c></tag> <item>If <c><anno>Option</anno></c> is an invalid option. </item> <tag><c>badarg</c></tag> <item>The same failure as for <seealso marker="#demonitor/1">demonitor/1</seealso>. </item> </taglist> </desc> </func> <func> <name name="disconnect_node" arity="1"/> <fsummary>Forces the disconnection of a node.</fsummary> <desc> <p>Forces the disconnection of a node. This appears to the node <c><anno>Node</anno></c> as if the local node has crashed. This BIF is mainly used in the Erlang network authentication protocols.</p> <p>Returns <c>true</c> if disconnection succeeds, otherwise <c>false</c>. If the local node is not alive, <c>ignored</c> is returned.</p> </desc> </func> <func> <name name="display" arity="1"/> <fsummary>Prints a term on standard output.</fsummary> <desc> <p>Prints a text representation of <c><anno>Term</anno></c> on the standard output. On OSE, the term is printed to the ramlog.</p> <warning> <p>This BIF is intended for debugging only.</p> </warning> </desc> </func> <func> <name name="element" arity="2"/> <fsummary>Returns the Nth element of a tuple.</fsummary> <type_desc variable="N">1..tuple_size(<anno>Tuple</anno>)</type_desc> <desc> <p>Returns the <c><anno>N</anno></c>th element (numbering from 1) of <c><anno>Tuple</anno></c>, for example:</p> <pre> > <input>element(2, {a, b, c}).</input> b</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="erase" arity="0"/> <fsummary>Returns and deletes the process dictionary.</fsummary> <desc> <p>Returns the process dictionary and deletes it, for example:</p> <pre> > <input>put(key1, {1, 2, 3}),</input> <input>put(key2, [a, b, c]),</input> <input>erase().</input> [{key1,{1,2,3}},{key2,[a,b,c]}]</pre> </desc> </func> <func> <name name="erase" arity="1"/> <fsummary>Returns and deletes a value from the process dictionary.</fsummary> <desc> <p>Returns the value <c><anno>Val</anno></c> associated with <c><anno>Key</anno></c> and deletes it from the process dictionary. Returns <c>undefined</c> if no value is associated with <c><anno>Key</anno></c>.</p> <p>Example:</p> <pre> > <input>put(key1, {merry, lambs, are, playing}),</input> <input>X = erase(key1),</input> <input>{X, erase(key1)}.</input> {{merry,lambs,are,playing},undefined}</pre> </desc> </func> <func> <name name="error" arity="1"/> <fsummary>Stops execution with a given reason.</fsummary> <desc> <p>Stops the execution of the calling process with the reason <c><anno>Reason</anno></c>, where <c><anno>Reason</anno></c> is any term. The exit reason is <c>{<anno>Reason</anno>, Where}</c>, where <c>Where</c> is a list of the functions most recently called (the current function first). Since evaluating this function causes the process to terminate, it has no return value.</p> <p>Example:</p> <pre> > <input>catch error(foobar).</input> {'EXIT',{foobar,[{erl_eval,do_apply,5}, {erl_eval,expr,5}, {shell,exprs,6}, {shell,eval_exprs,6}, {shell,eval_loop,3}]}}</pre> </desc> </func> <func> <name name="error" arity="2"/> <fsummary>Stops execution with a given reason.</fsummary> <desc> <p>Stops the execution of the calling process with the reason <c><anno>Reason</anno></c>, where <c><anno>Reason</anno></c> is any term. The exit reason is <c>{<anno>Reason</anno>, Where}</c>, where <c>Where</c> is a list of the functions most recently called (the current function first). <c><anno>Args</anno></c> is expected to be the list of arguments for the current function; in Beam it is used to provide the arguments for the current function in the term <c>Where</c>. Since evaluating this function causes the process to terminate, it has no return value.</p> </desc> </func> <func> <name name="exit" arity="1"/> <fsummary>Stops execution with a given reason.</fsummary> <desc> <p>Stops the execution of the calling process with exit reason <c><anno>Reason</anno></c>, where <c><anno>Reason</anno></c> is any term. Since evaluating this function causes the process to terminate, it has no return value.</p> <p>Example:</p> <pre> > <input>exit(foobar).</input> ** exception exit: foobar > <input>catch exit(foobar).</input> {'EXIT',foobar}</pre> </desc> </func> <func> <name name="exit" arity="2"/> <fsummary>Sends an exit signal to a process or a port.</fsummary> <desc> <p>Sends an exit signal with exit reason <c><anno>Reason</anno></c> to the process or port identified by <c><anno>Pid</anno></c>.</p> <p>The following behavior applies if <c><anno>Reason</anno></c> is any term, except <c>normal</c> or <c>kill</c>:</p> <list type="bulleted"> <item>If <c><anno>Pid</anno></c> is not trapping exits, <c><anno>Pid</anno></c> itself exits with exit reason <c><anno>Reason</anno></c>. </item> <item>If <c><anno>Pid</anno></c> is trapping exits, the exit signal is transformed into a message <c>{'EXIT', From, <anno>Reason</anno>}</c> and delivered to the message queue of <c><anno>Pid</anno></c>. </item> <item><c>From</c> is the process identifier of the process that sent the exit signal. See also <seealso marker="#process_flag/2">process_flag/2</seealso>. </item> </list> <p>If <c><anno>Reason</anno></c> is the atom <c>normal</c>, <c><anno>Pid</anno></c> does not exit. If it is trapping exits, the exit signal is transformed into a message <c>{'EXIT', From, normal}</c> and delivered to its message queue.</p> <p>If <c><anno>Reason</anno></c> is the atom <c>kill</c>, that is, if <c>exit(<anno>Pid</anno>, kill)</c> is called, an untrappable exit signal is sent to <c><anno>Pid</anno></c>, which unconditionally exits with exit reason <c>killed</c>. </p> </desc> </func> <func> <name name="external_size" arity="1"/> <fsummary>Calculates the maximum size for a term encoded in the Erlang external term format.</fsummary> <desc> <p>Calculates, without doing the encoding, the maximum byte size for a term encoded in the Erlang external term format. The following condition applies always:</p> <pre> > <input>Size1 = byte_size(term_to_binary(<anno>Term</anno>)),</input> > <input>Size2 = erlang:external_size(<anno>Term</anno>),</input> > <input>true = Size1 =< Size2.</input> true</pre> <p>This is equivalent to a call to:</p> <code>erlang:external_size(<anno>Term</anno>, [])</code> </desc> </func> <func> <name name="external_size" arity="2"/> <fsummary>Calculates the maximum size for a term encoded in the Erlang external term format.</fsummary> <desc> <p>Calculates, without doing the encoding, the maximum byte size for a term encoded in the Erlang external term format. The following condition applies always:</p> <pre> > <input>Size1 = byte_size(term_to_binary(<anno>Term</anno>, <anno>Options</anno>)),</input> > <input>Size2 = erlang:external_size(<anno>Term</anno>, <anno>Options</anno>),</input> > <input>true = Size1 =< Size2.</input> true</pre> <p>Option <c>{minor_version, <anno>Version</anno>}</c> specifies how floats are encoded. For a detailed description, see <seealso marker="#term_to_binary/2">term_to_binary/2</seealso>.</p> </desc> </func> <func> <name name="float" arity="1"/> <fsummary>Converts a number to a float.</fsummary> <desc> <p>Returns a float by converting <c><anno>Number</anno></c> to a float, for example:</p> <pre> > <input>float(55).</input> 55.0</pre> <p>Allowed in guard tests.</p> <note> <p>If used on the top level in a guard, it tests whether the argument is a floating point number; for clarity, use <seealso marker="#is_float/1">is_float/1</seealso> instead.</p> <p>When <c>float/1</c> is used in an expression in a guard, such as '<c>float(A) == 4.0</c>', it converts a number as described earlier.</p> </note> </desc> </func> <func> <name name="float_to_binary" arity="1"/> <fsummary>Text representation of a float.</fsummary> <desc> <p>The same as <c>float_to_binary(<anno>Float</anno>,[{scientific,20}])</c>.</p> </desc> </func> <func> <name name="float_to_binary" arity="2"/> <fsummary>Text representation of a float formatted using given options.</fsummary> <desc> <p>Returns a binary corresponding to the text representation of <c><anno>Float</anno></c> using fixed decimal point formatting. <c><anno>Options</anno></c> behaves in the same way as <seealso marker="#float_to_list/2">float_to_list/2</seealso>.</p> <p>Examples:</p> <pre> > <input>float_to_binary(7.12, [{decimals, 4}]).</input> <<"7.1200">> > <input>float_to_binary(7.12, [{decimals, 4}, compact]).</input> <<"7.12">></pre> </desc> </func> <func> <name name="float_to_list" arity="1"/> <fsummary>Text representation of a float.</fsummary> <desc> <p>The same as <c>float_to_list(<anno>Float</anno>,[{scientific,20}])</c>.</p> </desc> </func> <func> <name name="float_to_list" arity="2"/> <fsummary>Text representation of a float formatted using given options.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c>Float</c> using fixed decimal point formatting. The options are as follows:</p> <list type="bulleted"> <item>If option <c>decimals</c> is specified, the returned value contains at most <c>Decimals</c> number of digits past the decimal point. If the number does not fit in the internal static buffer of 256 bytes, the function throws <c>badarg</c>. </item> <item>If option <c>compact</c> is provided, the trailing zeros at the end of the list are truncated. This option is only meaningful together with option <c>decimals</c>. </item> <item>If option <c>scientific</c> is provided, the float is formatted using scientific notation with <c>Decimals</c> digits of precision. </item> <item>If <c>Options</c> is <c>[]</c>, the function behaves as <seealso marker="#float_to_list/1">float_to_list/1</seealso>. </item> </list> <p>Examples:</p> <pre> > <input>float_to_list(7.12, [{decimals, 4}]).</input> "7.1200" > <input>float_to_list(7.12, [{decimals, 4}, compact]).</input> "7.12"</pre> </desc> </func> <func> <name name="fun_info" arity="1"/> <fsummary>Information about a fun.</fsummary> <desc> <p>Returns a list with information about the fun <c><anno>Fun</anno></c>. Each list element is a tuple. The order of the tuples is undefined, and more tuples can be added in a future release.</p> <warning> <p>This BIF is mainly intended for debugging, but it can sometimes be useful in library functions that need to verify, for example, the arity of a fun.</p> </warning> <p>Two types of funs have slightly different semantics:</p> <list type="bulleted"> <item>A fun created by <c>fun M:F/A</c> is called an <em>external</em> fun. Calling it will always call the function <c>F</c> with arity <c>A</c> in the latest code for module <c>M</c>. Notice that module <c>M</c> does not even need to be loaded when the fun <c>fun M:F/A</c> is created. </item> <item>All other funs are called <em>local</em>. When a local fun is called, the same version of the code that created the fun is called (even if a newer version of the module has been loaded). </item> </list> <p>The following elements are always present in the list for both local and external funs:</p> <taglist> <tag><c>{type, Type}</c></tag> <item> <p><c>Type</c> is <c>local</c> or <c>external</c>.</p> </item> <tag><c>{module, Module}</c></tag> <item> <p><c>Module</c> (an atom) is the module name.</p> <p>If <c>Fun</c> is a local fun, <c>Module</c> is the module in which the fun is defined.</p> <p>If <c>Fun</c> is an external fun, <c>Module</c> is the module that the fun refers to.</p> </item> <tag><c>{name, Name}</c></tag> <item> <p><c>Name</c> (an atom) is a function name.</p> <p>If <c>Fun</c> is a local fun, <c>Name</c> is the name of the local function that implements the fun. (This name was generated by the compiler, and is only of informational use. As it is a local function, it cannot be called directly.) If no code is currently loaded for the fun, <c>[]</c> is returned instead of an atom.</p> <p>If <c>Fun</c> is an external fun, <c>Name</c> is the name of the exported function that the fun refers to.</p> </item> <tag><c>{arity, Arity}</c></tag> <item> <p><c>Arity</c> is the number of arguments that the fun is to be called with.</p> </item> <tag><c>{env, Env}</c></tag> <item> <p><c>Env</c> (a list) is the environment or free variables for the fun. For external funs, the returned list is always empty.</p> </item> </taglist> <p>The following elements are only present in the list if <c>Fun</c> is local:</p> <taglist> <tag><c>{pid, Pid}</c></tag> <item> <p><c>Pid</c> is the process identifier of the process that originally created the fun.</p> </item> <tag><c>{index, Index}</c></tag> <item> <p><c>Index</c> (an integer) is an index into the module fun table.</p> </item> <tag><c>{new_index, Index}</c></tag> <item> <p><c>Index</c> (an integer) is an index into the module fun table.</p> </item> <tag><c>{new_uniq, Uniq}</c></tag> <item> <p><c>Uniq</c> (a binary) is a unique value for this fun. It is calculated from the compiled code for the entire module.</p> </item> <tag><c>{uniq, Uniq}</c></tag> <item> <p><c>Uniq</c> (an integer) is a unique value for this fun. As from OTP R15, this integer is calculated from the compiled code for the entire module. Before OTP R15, this integer was based on only the body of the fun.</p> </item> </taglist> </desc> </func> <func> <name name="fun_info" arity="2"/> <fsummary>Information about a fun.</fsummary> <type name="fun_info_item"/> <desc> <p>Returns information about <c><anno>Fun</anno></c> as specified by <c><anno>Item</anno></c>, in the form <c>{<anno>Item</anno>,<anno>Info</anno>}</c>.</p> <p>For any fun, <c><anno>Item</anno></c> can be any of the atoms <c>module</c>, <c>name</c>, <c>arity</c>, <c>env</c>, or <c>type</c>.</p> <p>For a local fun, <c><anno>Item</anno></c> can also be any of the atoms <c>index</c>, <c>new_index</c>, <c>new_uniq</c>, <c>uniq</c>, and <c>pid</c>. For an external fun, the value of any of these items is always the atom <c>undefined</c>.</p> <p>See <seealso marker="#fun_info/1">erlang:fun_info/1</seealso>.</p> </desc> </func> <func> <name name="fun_to_list" arity="1"/> <fsummary>Text representation of a fun.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Fun</anno></c>.</p> </desc> </func> <func> <name name="function_exported" arity="3"/> <fsummary>Checks if a function is exported and loaded.</fsummary> <desc> <p>Returns <c>true</c> if the module <c><anno>Module</anno></c> is loaded and contains an exported function <c><anno>Function</anno>/<anno>Arity</anno></c>, or if there is a BIF (a built-in function implemented in C) with the given name, otherwise returns <c>false</c>.</p> <note><p>This function used to return false for built-in functions before the 18.0 release.</p></note> </desc> </func> <func> <name name="garbage_collect" arity="0"/> <fsummary>Forces an immediate garbage collection of the calling process.</fsummary> <desc> <p>Forces an immediate garbage collection of the executing process. The function is not to be used unless it has been noticed (or there are good reasons to suspect) that the spontaneous garbage collection will occur too late or not at all.</p> <warning> <p>Improper use can seriously degrade system performance.</p> </warning> </desc> </func> <func> <name name="garbage_collect" arity="1"/> <fsummary>Garbage collects a process.</fsummary> <desc> <p>The same as <seealso marker="#garbage_collect/2"><c>garbage_collect(<anno>Pid</anno>, [])</c></seealso>.</p> </desc> </func> <func> <name name="garbage_collect" arity="2"/> <fsummary>Garbage collects a process.</fsummary> <desc> <p>Garbage collects the node local process identified by <c><anno>Pid</anno></c>.</p> <p>The available <c><anno>Option</anno></c>s are as follows:</p> <taglist> <tag><c>{async, RequestId}</c></tag> <item>The function <c>garbage_collect/2</c> returns the value <c>async</c> immediately after the request has been sent. When the request has been processed, the process that called this function is passed a message on the form <c>{garbage_collect, <anno>RequestId</anno>, <anno>GCResult</anno>}</c>. </item> </taglist> <p>If <c><anno>Pid</anno></c> equals <c>self()</c>, and no <c>async</c> option has been passed, the garbage collection is performed at once, that is, the same as calling <seealso marker="#garbage_collect/0">garbage_collect/0</seealso>. Otherwise a request for garbage collection is sent to the process identified by <c><anno>Pid</anno></c>, and will be handled when appropriate. If no <c>async</c> option has been passed, the caller blocks until <c><anno>GCResult</anno></c> is available and can be returned.</p> <p><c><anno>GCResult</anno></c> informs about the result of the garbage collection request as follows:</p> <taglist> <tag><c>true</c></tag> <item> The process identified by <c><anno>Pid</anno></c> has been garbage collected. </item> <tag><c>false</c></tag> <item> No garbage collection was performed, as the process identified by <c><anno>Pid</anno></c> terminated before the request could be satisfied. </item> </taglist> <p>Notice that the same caveats apply as for <seealso marker="#garbage_collect/0">garbage_collect/0</seealso>.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Pid</anno></c> is not a node local process identifier. </item> <tag><c>badarg</c></tag> <item> If <c><anno>OptionList</anno></c> is an invalid list of options. </item> </taglist> </desc> </func> <func> <name name="get" arity="0"/> <fsummary>Returns the process dictionary.</fsummary> <desc> <p>Returns the process dictionary as a list of <c>{<anno>Key</anno>, <anno>Val</anno>}</c> tuples, for example:</p> <pre> > <input>put(key1, merry),</input> <input>put(key2, lambs),</input> <input>put(key3, {are, playing}),</input> <input>get().</input> [{key1,merry},{key2,lambs},{key3,{are,playing}}]</pre> </desc> </func> <func> <name name="get" arity="1"/> <fsummary>Returns a value from the process dictionary.</fsummary> <desc> <p>Returns the value <c><anno>Val</anno></c> associated with <c><anno>Key</anno></c> in the process dictionary, or <c>undefined</c> if <c><anno>Key</anno></c> does not exist.</p> <p>Example:</p> <pre> > <input>put(key1, merry),</input> <input>put(key2, lambs),</input> <input>put({any, [valid, term]}, {are, playing}),</input> <input>get({any, [valid, term]}).</input> {are,playing}</pre> </desc> </func> <func> <name name="get_cookie" arity="0"/> <fsummary>Gets the magic cookie of the local node.</fsummary> <desc> <p>Returns the magic cookie of the local node if the node is alive, otherwise the atom <c>nocookie</c>.</p> </desc> </func> <func> <name name="get_keys" arity="0"/> <fsummary>Return a list of all keys from the process dictionary</fsummary> <desc> <p>Returns a list of keys all keys present in the process dictionary.</p> <pre> > <input>put(dog, {animal,1}),</input> <input>put(cow, {animal,2}),</input> <input>put(lamb, {animal,3}),</input> <input>get_keys().</input> [dog,cow,lamb]</pre> </desc> </func> <func> <name name="get_keys" arity="1"/> <fsummary>Returns a list of keys from the process dictionary.</fsummary> <desc> <p>Returns a list of keys that are associated with the value <c><anno>Val</anno></c> in the process dictionary, for example:</p> <pre> > <input>put(mary, {1, 2}),</input> <input>put(had, {1, 2}),</input> <input>put(a, {1, 2}),</input> <input>put(little, {1, 2}),</input> <input>put(dog, {1, 3}),</input> <input>put(lamb, {1, 2}),</input> <input>get_keys({1, 2}).</input> [mary,had,a,little,lamb]</pre> </desc> </func> <func> <name name="get_stacktrace" arity="0"/> <fsummary>Gets the call stack back-trace of the last exception.</fsummary> <type name="stack_item"/> <desc> <p>Gets the call stack back-trace (<em>stacktrace</em>) of the last exception in the calling process as a list of <c>{<anno>Module</anno>,<anno>Function</anno>,<anno>Arity</anno>,<anno>Location</anno>}</c> tuples. Field <c><anno>Arity</anno></c> in the first tuple can be the argument list of that function call instead of an arity integer, depending on the exception.</p> <p>If there has not been any exceptions in a process, the stacktrace is <c>[]</c>. After a code change for the process, the stacktrace can also be reset to <c>[]</c>.</p> <p>The stacktrace is the same data as the <c>catch</c> operator returns, for example:</p> <p><c>{'EXIT',{badarg,Stacktrace}} = catch abs(x)</c></p> <p><c><anno>Location</anno></c> is a (possibly empty) list of two-tuples that can indicate the location in the source code of the function. The first element is an atom describing the type of information in the second element. The following items can occur:</p> <taglist> <tag><c>file</c></tag> <item>The second element of the tuple is a string (list of characters) representing the file name of the source file of the function. </item> <tag><c>line</c></tag> <item>The second element of the tuple is the line number (an integer greater than zero) in the source file where the exception occurred or the function was called. </item> </taglist> <p>See also <seealso marker="#error/1">erlang:error/1</seealso> and <seealso marker="#error/2">erlang:error/2</seealso>.</p> </desc> </func> <func> <name name="group_leader" arity="0"/> <fsummary>Gets the group leader for the calling process.</fsummary> <desc> <p>Returns the process identifier of the group leader for the process evaluating the function.</p> <p>Every process is a member of some process group and all groups have a <em>group leader</em>. All I/O from the group is channeled to the group leader. When a new process is spawned, it gets the same group leader as the spawning process. Initially, at system start-up, <c>init</c> is both its own group leader and the group leader of all processes.</p> </desc> </func> <func> <name name="group_leader" arity="2"/> <fsummary>Sets the group leader for a process.</fsummary> <desc> <p>Sets the group leader of <c><anno>Pid</anno></c> to <c><anno>GroupLeader</anno></c>. Typically, this is used when a process started from a certain shell is to have another group leader than <c>init</c>.</p> <p>See also <seealso marker="#group_leader/0">group_leader/0</seealso>.</p> </desc> </func> <func> <name name="halt" arity="0"/> <fsummary>Halts the Erlang runtime system and indicates normal exit to the calling environment.</fsummary> <desc> <p>The same as <seealso marker="#halt/2"><c>halt(0, [])</c></seealso>.</p> <p>Example:</p> <pre> > <input>halt().</input> os_prompt% </pre> </desc> </func> <func> <name name="halt" arity="1"/> <fsummary>Halts the Erlang runtime system.</fsummary> <desc> <p>The same as <seealso marker="#halt/2"><c>halt(<anno>Status</anno>, [])</c></seealso>.</p> <p>Example:</p> <pre> > <input>halt(17).</input> os_prompt% <input>echo $?</input> 17 os_prompt% </pre> </desc> </func> <func> <name name="halt" arity="2"/> <fsummary>Halts the Erlang runtime system.</fsummary> <desc> <p><c><anno>Status</anno></c> must be a non-negative integer, a string, or the atom <c>abort</c>. Halts the Erlang runtime system. Has no return value. Depending on <c><anno>Status</anno></c>, the following occurs:</p> <taglist> <tag>integer()</tag> <item>The runtime system exits with integer value <c><anno>Status</anno></c> as status code to the calling environment (OS). </item> <tag>string()</tag> <item>An Erlang crash dump is produced with <c><anno>Status</anno></c> as slogan. Then the runtime system exits with status code <c>1</c>. </item> <tag><c>abort</c></tag> <item> The runtime system aborts producing a core dump, if that is enabled in the OS. </item> </taglist> <note><p>On many platforms, the OS supports only status codes 0-255.</p></note> <p>For integer <c><anno>Status</anno></c>, the Erlang runtime system closes all ports and allows async threads to finish their operations before exiting. To exit without such flushing, use <c><anno>Option</anno></c> as <c>{flush,false}</c>.</p> <p>For statuses <c>string()</c> and <c>abort</c>, option <c>flush</c> is ignored and flushing is <em>not</em> done.</p> </desc> </func> <func> <name name="hash" arity="2"/> <fsummary>Hash function (deprecated).</fsummary> <desc> <p>Returns a hash value for <c><anno>Term</anno></c> within the range <c>1..<anno>Range</anno></c>. The maximum range is 1..2^27-1.</p> <warning> <p>This BIF is deprecated, as the hash value can differ on different architectures. The hash values for integer terms higher than 2^27 and large binaries are poor. The BIF is retained for backward compatibility reasons (it can have been used to hash records into a file), but all new code is to use one of the BIFs <c>erlang:phash/2</c> or <c>erlang:phash2/1,2</c> instead.</p> </warning> </desc> </func> <func> <name name="hd" arity="1"/> <fsummary>Head of a list.</fsummary> <desc> <p>Returns the head of <c><anno>List</anno></c>, that is, the first element, for example:</p> <pre> > <input>hd([1,2,3,4,5]).</input> 1</pre> <p>Allowed in guard tests.</p> <p>Failure: <c>badarg</c> if <c><anno>List</anno></c> is the empty list <c>[]</c>.</p> </desc> </func> <func> <name name="hibernate" arity="3"/> <fsummary>Hibernates a process until a message is sent to it.</fsummary> <desc> <p>Puts the calling process into a wait state where its memory allocation has been reduced as much as possible. This is useful if the process does not expect to receive any messages soon.</p> <p>The process is awaken when a message is sent to it, and control resumes in <c><anno>Module</anno>:<anno>Function</anno></c> with the arguments given by <c><anno>Args</anno></c> with the call stack emptied, meaning that the process terminates when that function returns. Thus <c>erlang:hibernate/3</c> never returns to its caller.</p> <p>If the process has any message in its message queue, the process is awakened immediately in the same way as described earlier.</p> <p>In more technical terms, what <c>erlang:hibernate/3</c> does is the following. It discards the call stack for the process, and then garbage collects the process. After this, all live data is in one continuous heap. The heap is then shrunken to the exact same size as the live data that it holds (even if that size is less than the minimum heap size for the process).</p> <p>If the size of the live data in the process is less than the minimum heap size, the first garbage collection occurring after the process is awakened ensures that the heap size is changed to a size not smaller than the minimum heap size.</p> <p>Notice that emptying the call stack means that any surrounding <c>catch</c> is removed and must be reinserted after hibernation. One effect of this is that processes started using <c>proc_lib</c> (also indirectly, such as <c>gen_server</c> processes), are to use <seealso marker="stdlib:proc_lib#hibernate/3">proc_lib:hibernate/3</seealso> instead, to ensure that the exception handler continues to work when the process wakes up.</p> </desc> </func> <func> <name name="insert_element" arity="3"/> <fsummary>Inserts an element at index in a tuple.</fsummary> <type_desc variable="Index">1..tuple_size(<anno>Tuple1</anno>) + 1</type_desc> <desc> <p>Returns a new tuple with element <c><anno>Term</anno></c> inserted at position <c><anno>Index</anno></c> in tuple <c><anno>Tuple1</anno></c>. All elements from position <c><anno>Index</anno></c> and upwards are pushed one step higher in the new tuple <c><anno>Tuple2</anno></c>.</p> <p>Example:</p> <pre> > <input>erlang:insert_element(2, {one, two, three}, new).</input> {one,new,two,three}</pre> </desc> </func> <func> <name name="integer_to_binary" arity="1"/> <fsummary>Text representation of an integer.</fsummary> <desc> <p>Returns a binary corresponding to the text representation of <c><anno>Integer</anno></c>, for example:</p> <pre> > <input>integer_to_binary(77).</input> <<"77">></pre> </desc> </func> <func> <name name="integer_to_binary" arity="2"/> <fsummary>Text representation of an integer.</fsummary> <desc> <p>Returns a binary corresponding to the text representation of <c><anno>Integer</anno></c> in base <c><anno>Base</anno></c>, for example:</p> <pre> > <input>integer_to_binary(1023, 16).</input> <<"3FF">></pre> </desc> </func> <func> <name name="integer_to_list" arity="1"/> <fsummary>Text representation of an integer.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Integer</anno></c>, for example:</p> <pre> > <input>integer_to_list(77).</input> "77"</pre> </desc> </func> <func> <name name="integer_to_list" arity="2"/> <fsummary>Text representation of an integer.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Integer</anno></c> in base <c><anno>Base</anno></c>, for example:</p> <pre> > <input>integer_to_list(1023, 16).</input> "3FF"</pre> </desc> </func> <func> <name name="iolist_to_binary" arity="1"/> <fsummary>Converts an iolist to a binary.</fsummary> <desc> <p>Returns a binary that is made from the integers and binaries in <c><anno>IoListOrBinary</anno></c>, for example:</p> <pre> > <input>Bin1 = <<1,2,3>>.</input> <<1,2,3>> > <input>Bin2 = <<4,5>>.</input> <<4,5>> > <input>Bin3 = <<6>>.</input> <<6>> > <input>iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).</input> <<1,2,3,1,2,3,4,5,4,6>></pre> </desc> </func> <func> <name name="iolist_size" arity="1"/> <fsummary>Size of an iolist.</fsummary> <desc> <p>Returns an integer that is the size in bytes of the binary that would be the result of <c>iolist_to_binary(<anno>Item</anno>)</c>, for example:</p> <pre> > <input>iolist_size([1,2|<<3,4>>]).</input> 4</pre> </desc> </func> <func> <name name="is_alive" arity="0"/> <fsummary>Checks whether the local node is alive.</fsummary> <desc> <p>Returns <c>true</c> if the local node is alive (that is, if the node can be part of a distributed system), otherwise <c>false</c>.</p> </desc> </func> <func> <name name="is_atom" arity="1"/> <fsummary>Checks whether a term is an atom.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is an atom, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_binary" arity="1"/> <fsummary>Checks whether a term is a binary.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a binary, otherwise <c>false</c>.</p> <p>A binary always contains a complete number of bytes.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_bitstring" arity="1"/> <fsummary>Checks whether a term is a bitstring.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a bitstring (including a binary), otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_boolean" arity="1"/> <fsummary>Checks whether a term is a boolean.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is the atom <c>true</c> or the atom <c>false</c> (that is, a boolean). Otherwise returns <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_builtin" arity="3"/> <fsummary>Checks if a function is a BIF implemented in C.</fsummary> <desc> <p>This BIF is useful for builders of cross-reference tools.</p> <p>Returns <c>true</c> if <c><anno>Module</anno>:<anno>Function</anno>/<anno>Arity</anno></c> is a BIF implemented in C, otherwise <c>false</c>.</p> </desc> </func> <func> <name name="is_float" arity="1"/> <fsummary>Checks whether a term is a float.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a floating point number, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_function" arity="1"/> <fsummary>Checks whether a term is a fun.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a fun, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_function" arity="2"/> <fsummary>Checks whether a term is a fun with a given arity.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a fun that can be applied with <c><anno>Arity</anno></c> number of arguments, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_integer" arity="1"/> <fsummary>Checks whether a term is an integer.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is an integer, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_list" arity="1"/> <fsummary>Checks whether a term is a list.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a list with zero or more elements, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_map" arity="1"/> <fsummary>Checks whether a term is a map.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a map, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_number" arity="1"/> <fsummary>Checks whether a term is a number.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is an integer or a floating point number. Otherwise returns <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_pid" arity="1"/> <fsummary>Checks whether a term is a process identifier.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a process identifier, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_port" arity="1"/> <fsummary>Checks whether a term is a port.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a port identifier, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_process_alive" arity="1"/> <fsummary>Checks whether a process is alive.</fsummary> <desc> <p><c><anno>Pid</anno></c> must refer to a process at the local node.</p> <p>Returns <c>true</c> if the process exists and is alive, that is, is not exiting and has not exited. Otherwise returns <c>false</c>. </p> </desc> </func> <func> <name name="is_record" arity="2"/> <fsummary>Checks whether a term appears to be a record.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a tuple and its first element is <c><anno>RecordTag</anno></c>. Otherwise returns <c>false</c>.</p> <note> <p>Normally the compiler treats calls to <c>is_record/2</c> specially. It emits code to verify that <c><anno>Term</anno></c> is a tuple, that its first element is <c><anno>RecordTag</anno></c>, and that the size is correct. However, if <c><anno>RecordTag</anno></c> is not a literal atom, the BIF <c>is_record/2</c> is called instead and the size of the tuple is not verified.</p> </note> <p>Allowed in guard tests, if <c><anno>RecordTag</anno></c> is a literal atom.</p> </desc> </func> <func> <name name="is_record" arity="3"/> <fsummary>Checks whether a term appears to be a record.</fsummary> <desc> <p><c><anno>RecordTag</anno></c> must be an atom.</p> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a tuple, its first element is <c><anno>RecordTag</anno></c>, and its size is <c><anno>Size</anno></c>. Otherwise returns <c>false</c>.</p> <p>Allowed in guard tests if <c><anno>RecordTag</anno></c> is a literal atom and <c>Size</c> is a literal integer.</p> <note> <p>This BIF is documented for completeness. Usually <c>is_record/2</c> is to be used.</p> </note> </desc> </func> <func> <name name="is_reference" arity="1"/> <fsummary>Checks whether a term is a reference.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a reference, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="is_tuple" arity="1"/> <fsummary>Checks whether a term is a tuple.</fsummary> <desc> <p>Returns <c>true</c> if <c><anno>Term</anno></c> is a tuple, otherwise <c>false</c>.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="length" arity="1"/> <fsummary>Length of a list.</fsummary> <desc> <p>Returns the length of <c><anno>List</anno></c>, for example:</p> <pre> > <input>length([1,2,3,4,5,6,7,8,9]).</input> 9</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="link" arity="1"/> <fsummary>Creates a link to another process (or port).</fsummary> <desc> <p>Creates a link between the calling process and another process (or port) <c><anno>PidOrPort</anno></c>, if there is not such a link already. If a process attempts to create a link to itself, nothing is done. Returns <c>true</c>.</p> <p>If <c><anno>PidOrPort</anno></c> does not exist, the behavior of the BIF depends on if the calling process is trapping exits or not (see <seealso marker="#process_flag/2">process_flag/2</seealso>):</p> <list type="bulleted"> <item>If the calling process is not trapping exits, and checking <c><anno>PidOrPort</anno></c> is cheap (that is, if <c><anno>PidOrPort</anno></c> is local), <c>link/1</c> fails with reason <c>noproc</c>.</item> <item>Otherwise, if the calling process is trapping exits, and/or <c><anno>PidOrPort</anno></c> is remote, <c>link/1</c> returns <c>true</c>, but an exit signal with reason <c>noproc</c> is sent to the calling process.</item> </list> </desc> </func> <func> <name name="list_to_atom" arity="1"/> <fsummary>Converts from text representation to an atom.</fsummary> <desc> <p>Returns the atom whose text representation is <c><anno>String</anno></c>.</p> <p><c><anno>String</anno></c> can only contain ISO-latin-1 characters (that is, numbers less than 256) as the implementation does not allow unicode characters equal to or above 256 in atoms. For more information on Unicode support in atoms, see <seealso marker="erl_ext_dist#utf8_atoms">note on UTF-8 encoded atoms</seealso> in Section "External Term Format" in the User's Guide.</p> <p>Example:</p> <pre> > <input>list_to_atom("Erlang").</input> 'Erlang'</pre> </desc> </func> <func> <name name="list_to_binary" arity="1"/> <fsummary>Converts a list to a binary.</fsummary> <desc> <p>Returns a binary that is made from the integers and binaries in <c><anno>IoList</anno></c>, for example:</p> <pre> > <input>Bin1 = <<1,2,3>>.</input> <<1,2,3>> > <input>Bin2 = <<4,5>>.</input> <<4,5>> > <input>Bin3 = <<6>>.</input> <<6>> > <input>list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).</input> <<1,2,3,1,2,3,4,5,4,6>></pre> </desc> </func> <func> <name name="list_to_bitstring" arity="1"/> <fsummary>Converts a list to a bitstring.</fsummary> <type name="bitstring_list"/> <desc> <p>Returns a bitstring that is made from the integers and bitstrings in <c><anno>BitstringList</anno></c>. (The last tail in <c><anno>BitstringList</anno></c> is allowed to be a bitstring.)</p> <p>Example:</p> <pre> > <input>Bin1 = <<1,2,3>>.</input> <<1,2,3>> > <input>Bin2 = <<4,5>>.</input> <<4,5>> > <input>Bin3 = <<6,7:4>>.</input> <<6,7:4>> > <input>list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]).</input> <<1,2,3,1,2,3,4,5,4,6,7:4>></pre> </desc> </func> <func> <name name="list_to_existing_atom" arity="1"/> <fsummary>Converts from text representation to an atom.</fsummary> <desc> <p>Returns the atom whose text representation is <c><anno>String</anno></c>, but only if there already exists such atom.</p> <p>Failure: <c>badarg</c> if there does not already exist an atom whose text representation is <c><anno>String</anno></c>.</p> </desc> </func> <func> <name name="list_to_float" arity="1"/> <fsummary>Converts from text representation to a float.</fsummary> <desc> <p>Returns the float whose text representation is <c><anno>String</anno></c>, for example:</p> <pre> > <input>list_to_float("2.2017764e+0").</input> 2.2017764</pre> <p>Failure: <c>badarg</c> if <c><anno>String</anno></c> contains a bad representation of a float.</p> </desc> </func> <func> <name name="list_to_integer" arity="1"/> <fsummary>Converts from text representation to an integer.</fsummary> <desc> <p>Returns an integer whose text representation is <c><anno>String</anno></c>, for example:</p> <pre> > <input>list_to_integer("123").</input> 123</pre> <p>Failure: <c>badarg</c> if <c><anno>String</anno></c> contains a bad representation of an integer.</p> </desc> </func> <func> <name name="list_to_integer" arity="2"/> <fsummary>Converts from text representation to an integer.</fsummary> <desc> <p>Returns an integer whose text representation in base <c><anno>Base</anno></c> is <c><anno>String</anno></c>, for example:</p> <pre> > <input>list_to_integer("3FF", 16).</input> 1023</pre> <p>Failure: <c>badarg</c> if <c><anno>String</anno></c> contains a bad representation of an integer.</p> </desc> </func> <func> <name name="list_to_pid" arity="1"/> <fsummary>Converts from text representation to a pid.</fsummary> <desc> <p>Returns a process identifier whose text representation is a <c><anno>String</anno></c>, for example:</p> <pre> > <input>list_to_pid("<0.4.1>").</input> <0.4.1></pre> <p>Failure: <c>badarg</c> if <c><anno>String</anno></c> contains a bad representation of a process identifier.</p> <warning> <p>This BIF is intended for debugging and is not to be used in application programs.</p> </warning> </desc> </func> <func> <name name="list_to_tuple" arity="1"/> <fsummary>Converts a list to a tuple.</fsummary> <desc> <p>Returns a tuple corresponding to <c><anno>List</anno></c>, for example</p> <pre> > <input>list_to_tuple([share, ['Ericsson_B', 163]]).</input> {share, ['Ericsson_B', 163]}</pre> <p><c><anno>List</anno></c> can contain any Erlang terms.</p> </desc> </func> <func> <name name="load_module" arity="2"/> <fsummary>Loads object code for a module.</fsummary> <desc> <p>If <c><anno>Binary</anno></c> contains the object code for module <c><anno>Module</anno></c>, this BIF loads that object code. If the code for module <c><anno>Module</anno></c> already exists, all export references are replaced so they point to the newly loaded code. The previously loaded code is kept in the system as old code, as there can still be processes executing that code.</p> <p>Returns either <c>{module, <anno>Module</anno>}</c>, or <c>{error, <anno>Reason</anno>}</c> if loading fails. <c><anno>Reason</anno></c> is any of the following:</p> <taglist> <tag><c>badfile</c></tag> <item> <p>The object code in <c><anno>Binary</anno></c> has an incorrect format <em>or</em> the object code contains code for another module than <c><anno>Module</anno></c>.</p> </item> <tag><c>not_purged</c></tag> <item> <p><c><anno>Binary</anno></c> contains a module that cannot be loaded because old code for this module already exists.</p> </item> </taglist> <warning> <p>This BIF is intended for the code server (see <seealso marker="kernel:code">code(3)</seealso>) and is not to be used elsewhere.</p> </warning> </desc> </func> <func> <name name="load_nif" arity="2"/> <fsummary>Loads NIF library.</fsummary> <desc> <note> <p>Before OTP R14B, NIFs were an experimental feature. Versions before OTP R14B can have different and possibly incompatible NIF semantics and interfaces. For example, in OTP R13B03 the return value on failure was <c>{error,Reason,Text}</c>.</p> </note> <p>Loads and links a dynamic library containing native implemented functions (NIFs) for a module. <c><anno>Path</anno></c> is a file path to the shareable object/dynamic library file minus the OS-dependent file extension (<c>.so</c> for Unix and <c>.dll</c> for Windows. For information on how to implement a NIF library, see <seealso marker="erl_nif">erl_nif</seealso>.</p> <p><c><anno>LoadInfo</anno></c> can be any term. It is passed on to the library as part of the initialization. A good practice is to include a module version number to support future code upgrade scenarios.</p> <p>The call to <c>load_nif/2</c> must be made <em>directly</em> from the Erlang code of the module that the NIF library belongs to. It returns either <c>ok</c>, or <c>{error,{<anno>Reason</anno>,Text}}</c> if loading fails. <c><anno>Reason</anno></c> is one of the following atoms while <c><anno>Text</anno></c> is a human readable string that can give more information about the failure:</p> <taglist> <tag><c>load_failed</c></tag> <item>The OS failed to load the NIF library. </item> <tag><c>bad_lib</c></tag> <item>The library did not fulfill the requirements as a NIF library of the calling module. </item> <tag><c>load | reload | upgrade</c></tag> <item>The corresponding library callback was unsuccessful. </item> <tag><c>old_code</c></tag> <item>The call to <c>load_nif/2</c> was made from the old code of a module that has been upgraded; this is not allowed. </item> </taglist> </desc> </func> <func> <name name="loaded" arity="0"/> <fsummary>Lists all loaded modules.</fsummary> <desc> <p>Returns a list of all loaded Erlang modules (current and old code), including preloaded modules.</p> <p>See also <seealso marker="kernel:code">code(3)</seealso>.</p> </desc> </func> <func> <name name="localtime" arity="0"/> <fsummary>Current local date and time.</fsummary> <desc> <p>Returns the current local date and time, <c>{{Year, Month, Day}, {Hour, Minute, Second}}</c>, for example:</p> <pre> > <input>erlang:localtime().</input> {{1996,11,6},{14,45,17}}</pre> <p>The time zone and Daylight Saving Time correction depend on the underlying OS.</p> </desc> </func> <func> <name name="localtime_to_universaltime" arity="1"/> <fsummary>Converts from local to Universal Time Coordinated (UTC) date and time.</fsummary> <desc> <p>Converts local date and time to Universal Time Coordinated (UTC), if supported by the underlying OS. Otherwise no conversion is done and <c><anno>Localtime</anno></c> is returned.</p> <p>Example:</p> <pre> > <input>erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).</input> {{1996,11,6},{13,45,17}}</pre> <p>Failure: <c>badarg</c> if <c><anno>Localtime</anno></c> denotes an invalid date and time.</p> </desc> </func> <func> <name name="localtime_to_universaltime" arity="2"/> <fsummary>Converts from local to Universal Time Coordinated (UTC) date and time.</fsummary> <desc> <p>Converts local date and time to Universal Time Coordinated (UTC) as <c>erlang:localtime_to_universaltime/1</c>, but the caller decides if Daylight Saving Time is active.</p> <p>If <c><anno>IsDst</anno> == true</c>, <c><anno>Localtime</anno></c> is during Daylight Saving Time, if <c><anno>IsDst</anno> == false</c> it is not. If <c><anno>IsDst</anno> == undefined</c>, the underlying OS can guess, which is the same as calling <c>erlang:localtime_to_universaltime(<anno>Localtime</anno>)</c>.</p> <p>Examples:</p> <pre> > <input>erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).</input> {{1996,11,6},{12,45,17}} > <input>erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).</input> {{1996,11,6},{13,45,17}} > <input>erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).</input> {{1996,11,6},{13,45,17}}</pre> <p>Failure: <c>badarg</c> if <c><anno>Localtime</anno></c> denotes an invalid date and time.</p> </desc> </func> <func> <name name="make_ref" arity="0"/> <fsummary>Returns a unique reference.</fsummary> <desc> <p>Returns a <seealso marker="doc/efficiency_guide:advanced#unique_references">unique reference</seealso>. The reference is unique among connected nodes.</p> <warning><p>Known issue: When a node is restarted multiple times with the same node name, references created on a newer node can be mistaken for a reference created on an older node with the same node name.</p></warning> </desc> </func> <func> <name name="make_tuple" arity="2"/> <fsummary>Creates a new tuple of a given arity.</fsummary> <desc> <p>Creates a new tuple of the given <c><anno>Arity</anno></c>, where all elements are <c><anno>InitialValue</anno></c>, for example:</p> <pre> > <input>erlang:make_tuple(4, []).</input> {[],[],[],[]}</pre> </desc> </func> <func> <name name="make_tuple" arity="3"/> <fsummary>Creates a new tuple with given arity and contents.</fsummary> <desc> <p>Creates a tuple of size <c><anno>Arity</anno></c>, where each element has value <c><anno>DefaultValue</anno></c>, and then fills in values from <c><anno>InitList</anno></c>. Each list element in <c><anno>InitList</anno></c> must be a two-tuple, where the first element is a position in the newly created tuple and the second element is any term. If a position occurs more than once in the list, the term corresponding to the last occurrence is used.</p> <p>Example:</p> <pre> > <input>erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).</input> {{[],aa,[],[],zz}</pre> </desc> </func> <func> <name name="map_size" arity="1"/> <fsummary>Returns the size of a map.</fsummary> <desc> <p>Returns an integer, which is the number of key-value pairs in <c><anno>Map</anno></c>, for example:</p> <pre> > <input>map_size(#{a=>1, b=>2, c=>3}).</input> 3</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="max" arity="2"/> <fsummary>Returns the largest of two terms.</fsummary> <desc> <p>Returns the largest of <c><anno>Term1</anno></c> and <c><anno>Term2</anno></c>. If the terms are equal, <c><anno>Term1</anno></c> is returned.</p> </desc> </func> <func> <name name="md5" arity="1"/> <fsummary>Computes an MD5 message digest.</fsummary> <desc> <p>Computes an MD5 message digest from <c><anno>Data</anno></c>, where the length of the digest is 128 bits (16 bytes). <c><anno>Data</anno></c> is a binary or a list of small integers and binaries.</p> <p>For more information about MD5, see RFC 1321 - The MD5 Message-Digest Algorithm.</p> <warning><p>The MD5 Message-Digest Algorithm is <em>not</em> considered safe for code-signing or software-integrity purposes.</p></warning> </desc> </func> <func> <name name="md5_final" arity="1"/> <fsummary>Finishes the update of an MD5 context and returns the computed MD5 message digest.</fsummary> <desc> <p>Finishes the update of an MD5 <c><anno>Context</anno></c> and returns the computed <c>MD5</c> message digest.</p> </desc> </func> <func> <name name="md5_init" arity="0"/> <fsummary>Creates an MD5 context.</fsummary> <desc> <p>Creates an MD5 context, to be used in subsequent calls to <c>md5_update/2</c>.</p> </desc> </func> <func> <name name="md5_update" arity="2"/> <fsummary>Updates an MD5 context with data and returns a new context.</fsummary> <desc> <p>Updates an MD5 <c><anno>Context</anno></c> with <c><anno>Data</anno></c> and returns a <c><anno>NewContext</anno></c>.</p> </desc> </func> <func> <name name="memory" arity="0"/> <fsummary>Information about dynamically allocated memory.</fsummary> <type name="memory_type"/> <desc> <p>Returns a list with information about memory dynamically allocated by the Erlang emulator. Each list element is a tuple <c>{Type, Size}</c>. The first element <c><anno>Type</anno></c> is an atom describing memory type. The second element <c><anno>Size</anno></c> is the memory size in bytes.</p> <p>The memory types are as follows:</p> <taglist> <tag><c>total</c></tag> <item> <p>The total amount of memory currently allocated. This is the same as the sum of the memory size for <c>processes</c> and <c>system</c>.</p> </item> <tag><c>processes</c></tag> <item> <p>The total amount of memory currently allocated for the Erlang processes.</p> </item> <tag><c>processes_used</c></tag> <item> <p>The total amount of memory currently used by the Erlang processes. This is part of the memory presented as <c>processes</c> memory.</p> </item> <tag><c>system</c></tag> <item> <p>The total amount of memory currently allocated for the emulator that is not directly related to any Erlang process. Memory presented as <c>processes</c> is not included in this memory.</p> </item> <tag><c>atom</c></tag> <item> <p>The total amount of memory currently allocated for atoms. This memory is part of the memory presented as <c>system</c> memory.</p> </item> <tag><c>atom_used</c></tag> <item> <p>The total amount of memory currently used for atoms. This memory is part of the memory presented as <c>atom</c> memory.</p> </item> <tag><c>binary</c></tag> <item> <p>The total amount of memory currently allocated for binaries. This memory is part of the memory presented as <c>system</c> memory.</p> </item> <tag><c>code</c></tag> <item> <p>The total amount of memory currently allocated for Erlang code. This memory is part of the memory presented as <c>system</c> memory.</p> </item> <tag><c>ets</c></tag> <item> <p>The total amount of memory currently allocated for ets tables. This memory is part of the memory presented as <c>system</c> memory.</p> </item> <tag><c>low</c></tag> <item> <p>Only on 64-bit halfword emulator. The total amount of memory allocated in low memory areas that are restricted to less than 4 GB, although the system can have more memory.</p> <p>Can be removed in a future release of the halfword emulator.</p> </item> <tag><c>maximum</c></tag> <item> <p>The maximum total amount of memory allocated since the emulator was started. This tuple is only present when the emulator is run with instrumentation.</p> <p>For information on how to run the emulator with instrumentation, see <seealso marker="tools:instrument">instrument(3)</seealso> and/or <seealso marker="erts:erl">erl(1)</seealso>.</p> </item> </taglist> <note> <p>The <c>system</c> value is not complete. Some allocated memory that is to be part of this value is not.</p> <p>When the emulator is run with instrumentation, the <c>system</c> value is more accurate, but memory directly allocated for <c>malloc</c> (and friends) is still not part of the <c>system</c> value. Direct calls to <c>malloc</c> are only done from OS-specific runtime libraries and perhaps from user-implemented Erlang drivers that do not use the memory allocation functions in the driver interface.</p> <p>As the <c>total</c> value is the sum of <c>processes</c> and <c>system</c>, the error in <c>system</c> propagates to the <c>total</c> value.</p> <p>The different amounts of memory that are summed are <em>not</em> gathered atomically, which introduces an error in the result.</p> </note> <p>The different values have the following relation to each other. Values beginning with an uppercase letter is not part of the result.</p> <code type="none"> total = processes + system processes = processes_used + ProcessesNotUsed system = atom + binary + code + ets + OtherSystem atom = atom_used + AtomNotUsed RealTotal = processes + RealSystem RealSystem = system + MissedSystem</code> <p>More tuples in the returned list can be added in a future release.</p> <note> <p>The <c>total</c> value is supposed to be the total amount of memory dynamically allocated by the emulator. Shared libraries, the code of the emulator itself, and the emulator stacks are not supposed to be included. That is, the <c>total</c> value is <em>not</em> supposed to be equal to the total size of all pages mapped to the emulator.</p> <p>Furthermore, because of fragmentation and prereservation of memory areas, the size of the memory segments containing the dynamically allocated memory blocks can be much larger than the total size of the dynamically allocated memory blocks.</p> </note> <note> <p>As from <c>ERTS</c> 5.6.4, <c>erlang:memory/0</c> requires that all <seealso marker="erts:erts_alloc">erts_alloc(3)</seealso> allocators are enabled (default behavior).</p> </note> <p>Failure: <c>notsup</c> if an <seealso marker="erts:erts_alloc">erts_alloc(3)</seealso> allocator has been disabled.</p> </desc> </func> <func> <name name="memory" arity="1" clause_i="1"/> <name name="memory" arity="1" clause_i="2"/> <fsummary>Information about dynamically allocated memory.</fsummary> <type name="memory_type"/> <desc> <p>Returns the memory size in bytes allocated for memory of type <c><anno>Type</anno></c>. The argument can also be given as a list of <c>memory_type()</c> atoms, in which case a corresponding list of <c>{memory_type(), Size :: integer >= 0}</c> tuples is returned.</p> <note> <p>As from <c>ERTS</c> version 5.6.4, <c>erlang:memory/1</c> requires that all <seealso marker="erts:erts_alloc">erts_alloc(3)</seealso> allocators are enabled (default behavior).</p> </note> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Type</anno></c> is not one of the memory types listed in the description of <seealso marker="#memory/0">erlang:memory/0</seealso>. </item> <tag><c>badarg</c></tag> <item> If <c>maximum</c> is passed as <c><anno>Type</anno></c> and the emulator is not run in instrumented mode. </item> <tag><c>notsup</c></tag> <item> If an <seealso marker="erts:erts_alloc">erts_alloc(3)</seealso> allocator has been disabled. </item> </taglist> <p>See also <seealso marker="#memory/0">erlang:memory/0</seealso>.</p> </desc> </func> <func> <name name="min" arity="2"/> <fsummary>Returns the smallest of two terms.</fsummary> <desc> <p>Returns the smallest of <c><anno>Term1</anno></c> and <c><anno>Term2</anno></c>. If the terms are equal, <c><anno>Term1</anno></c> is returned.</p> </desc> </func> <func> <name name="module_loaded" arity="1"/> <fsummary>Checks if a module is loaded.</fsummary> <desc> <p>Returns <c>true</c> if the module <c><anno>Module</anno></c> is loaded, otherwise <c>false</c>. It does not attempt to load the module.</p> <warning> <p>This BIF is intended for the code server (see <seealso marker="kernel:code">code(3)</seealso>) and is not to be used elsewhere.</p> </warning> </desc> </func> <func> <name name="monitor" arity="2" clause_i="1"/> <name name="monitor" arity="2" clause_i="2"/> <fsummary>Starts monitoring.</fsummary> <type name="registered_name"/> <type name="registered_process_identifier"/> <type name="monitor_process_identifier"/> <desc> <p>Send a monitor request of type <c><anno>Type</anno></c> to the entity identified by <c><anno>Item</anno></c>. The caller of <c>monitor/2</c> will later be notified by a monitor message on the following format if the monitored state is changed:</p> <code type="none">{Tag, <anno>MonitorRef</anno>, <anno>Type</anno>, Object, Info}</code> <note><p>The monitor request is an asynchronous signal. That is, it takes time before the signal reaches its destination.</p></note> <p>Valid <c><anno>Type</anno></c>s:</p> <taglist> <tag><marker id="monitor_process"/><c>process</c></tag> <item> <p>Monitor the existence of the process identified by <c><anno>Item</anno></c>. Valid <c><anno>Item</anno></c>s in combination with the <c>process <anno>Type</anno></c> can be any of the following:</p> <taglist> <tag><c>pid()</c></tag> <item> <p>The process identifier of the process to monitor.</p> </item> <tag><c>{RegisteredName, Node}</c></tag> <item> <p>A tuple consisting of a registered name of a process and a node name. The process residing on the node <c>Node</c> with the registered name <c>{RegisteredName, Node}</c> will be monitored.</p> </item> <tag><c>RegisteredName</c></tag> <item> <p>The process locally registered as <c>RegisteredName</c> will become monitored.</p> </item> </taglist> <note><p>When a registered name is used, the process that has the registered name when the monitor request reach its destination will be monitored. The monitor is not effected if the registered name is unregistered, or unregistered and later registered on another process.</p></note> <p>The monitor is triggered either when the monitored process terminates, is non existing, or if the connection to it is lost. In the case the connection to it is lost, we do not know if it still exist or not. After this type of monitor has been triggered, the monitor is automatically removed.</p> <p>When the monitor is triggered a <c>'DOWN'</c> message is sent to the monitoring process. A <c>'DOWN'</c> message has the following pattern:</p> <code type="none">{'DOWN', MonitorRef, Type, Object, Info}</code> <p>Here <c>MonitorRef</c> and <c>Type</c> are the same as described earlier, and:</p> <taglist> <tag><c>Object</c></tag> <item> <p>equals:</p> <taglist> <tag><c><anno>Item</anno></c></tag> <item>If <c><anno>Item</anno></c> is specified by a process identifier.</item> <tag><c>{RegisteredName, Node}</c></tag> <item>If <c><anno>Item</anno></c> is specified as <c>RegisteredName</c>, or <c>{RegisteredName, Node}</c> where <c>Node</c> corresponds to the node that the monitored process resides on.</item> </taglist> </item> <tag><c>Info</c></tag> <item> <p>Either the exit reason of the process, <c>noproc</c> (non-existing process), or <c>noconnection</c> (no connection to the node where the monitored process resides).</p></item> </taglist> <p>The monitoring is turned off when the <c>'DOWN'</c> message is sent or when <seealso marker="#demonitor/1">demonitor/1</seealso> is called.</p> <p>If an attempt is made to monitor a process on an older node (where remote process monitoring is not implemented or where remote process monitoring by registered name is not implemented), the call fails with <c>badarg</c>.</p> <note> <p>The format of the <c>'DOWN'</c> message changed in ERTS version 5.2 (OTP R9B) for monitoring <em>by registered name</em>. Element <c>Object</c> of the <c>'DOWN'</c> message could in earlier versions sometimes be the process identifier of the monitored process and sometimes be the registered name. Now element <c>Object</c> is always a tuple consisting of the registered name and the node name. Processes on new nodes (ERTS version 5.2 or higher) always get <c>'DOWN'</c> messages on the new format even if they are monitoring processes on old nodes. Processes on old nodes always get <c>'DOWN'</c> messages on the old format.</p> </note> </item> <tag><marker id="monitor_time_offset"/><c>time_offset</c></tag> <item> <p>Monitor changes in <seealso marker="#time_offset/0">time offset</seealso> between <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> and <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso>. There is only one valid <c><anno>Item</anno></c> in combination with the <c>time_offset <anno>Type</anno></c>, namely the atom <c>clock_service</c>. Note that the atom <c>clock_service</c> is <em>not</em> the registered name of a process. In this specific case it serves as an identifier of the runtime system internal clock service at current runtime system instance.</p> <p>The monitor is triggered when the time offset is changed. This either if the time offset value is changed, or if the offset is changed from preliminary to final during <seealso marker="#system_flag_time_offset">finalization of the time offset</seealso> when the <seealso marker="time_correction#Single_Time_Warp_Mode">single time warp mode</seealso> is used. When a change from preliminary to final time offset is made, the monitor will be triggered once regardless of whether the time offset value was actually changed or not.</p> <p>If the runtime system is in <seealso marker="time_correction#Multi_Time_Warp_Mode">multi time warp mode</seealso>, the time offset will be changed when the runtime system detects that the <seealso marker="time_correction#OS_System_Time">OS system time</seealso> has changed. The runtime system will, however, not detect this immediately when it happens. A task checking the time offset is scheduled to execute at least once a minute, so under normal operation this should be detected within a minute, but during heavy load it might take longer time.</p> <p>The monitor will <em>not</em> be automatically removed after it has been triggered. That is, repeated changes of the time offset will trigger the monitor repeatedly.</p> <p>When the monitor is triggered a <c>'CHANGE'</c> message will be sent to the monitoring process. A <c>'CHANGE'</c> message has the following pattern:</p> <code type="none">{'CHANGE', MonitorRef, Type, Item, NewTimeOffset}</code> <p>where <c>MonitorRef</c>, <c><anno>Type</anno></c>, and <c><anno>Item</anno></c> are the same as described above, and <c>NewTimeOffset</c> is the new time offset.</p> <p>When the <c>'CHANGE'</c> message has been received you are guaranteed not to retrieve the old time offset when calling <seealso marker="#time_offset/0"><c>erlang:time_offset()</c></seealso>. Note that you can observe the change of the time offset when calling <c>erlang:time_offset()</c> before you get the <c>'CHANGE'</c> message.</p> </item> </taglist> <p>Making several calls to <c>monitor/2</c> for the same <c><anno>Item</anno></c> and/or <c><anno>Type</anno></c> is not an error; it results in as many independent monitoring instances.</p> <p>The monitor functionality is expected to be extended. That is, other <c><anno>Type</anno></c>s and <c><anno>Item</anno></c>s are expected to be supported in a future release.</p> <note> <p>If or when <c>monitor/2</c> is extended, other possible values for <c>Tag</c>, <c>Object</c> and <c>Info</c> in the monitor message will be introduced.</p> </note> </desc> </func> <func> <name name="monitor_node" arity="2"/> <fsummary>Monitors the status of a node.</fsummary> <desc> <p>Monitors the status of the node <c><anno>Node</anno></c>. If <c><anno>Flag</anno></c> is <c>true</c>, monitoring is turned on. If <c><anno>Flag</anno></c> is <c>false</c>, monitoring is turned off.</p> <p>Making several calls to <c>monitor_node(Node, true)</c> for the same <c><anno>Node</anno></c> is not an error; it results in as many independent monitoring instances.</p> <p>If <c><anno>Node</anno></c> fails or does not exist, the message <c>{nodedown, Node}</c> is delivered to the process. If a process has made two calls to <c>monitor_node(Node, true)</c> and <c><anno>Node</anno></c> terminates, two <c>nodedown</c> messages are delivered to the process. If there is no connection to <c><anno>Node</anno></c>, an attempt is made to create one. If this fails, a <c>nodedown</c> message is delivered.</p> <p>Nodes connected through hidden connections can be monitored as any other nodes.</p> <p>Failure: <c>badarg</c> if the local node is not alive.</p> </desc> </func> <func> <name name="monitor_node" arity="3"/> <fsummary>Monitors the status of a node.</fsummary> <desc> <p>Behaves as <seealso marker="#monitor_node/2">monitor_node/2</seealso> except that it allows an extra option to be given, namely <c>allow_passive_connect</c>. This option allows the BIF to wait the normal network connection time-out for the <em>monitored node</em> to connect itself, even if it cannot be actively connected from this node (that is, it is blocked). The state where this can be useful can only be achieved by using the <c>Kernel</c> option <c>dist_auto_connect once</c>. If that option is not used, option <c>allow_passive_connect</c> has no effect.</p> <note> <p>Option <c>allow_passive_connect</c> is used internally and is seldom needed in applications where the network topology and the <c>Kernel</c> options in effect are known in advance.</p> </note> <p>Failure: <c>badarg</c> if the local node is not alive or the option list is malformed.</p> </desc> </func> <func> <name name="monotonic_time" arity="0"/> <fsummary>Current Erlang monotonic time.</fsummary> <desc> <p>Returns the current <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso>. This is a monotonically increasing time since some unspecified point in time.</p> <note><p>This is a <seealso marker="time_correction#Monotonically_Increasing">monotonically increasing</seealso> time, but <em>not</em> a <seealso marker="time_correction#Strictly_Monotonically_Increasing">strictly monotonically increasing</seealso> time. That is, consecutive calls to <c>erlang:monotonic_time/0</c> can produce the same result.</p> <p>Different runtime system instances will use different unspecified points in time as base for their Erlang monotonic clocks. That is, it is <em>pointless</em> comparing monotonic times from different runtime system instances. Different runtime system instances may also place this unspecified point in time different relative runtime system start. It may be placed in the future (time at start is a negative value), the past (time at start is a positive value), or the runtime system start (time at start is zero). The monotonic time at runtime system start can be retrieved by calling <seealso marker="#system_info_start_time"><c>erlang:system_info(start_time)</c></seealso>.</p></note> </desc> </func> <func> <name name="monotonic_time" arity="1"/> <fsummary>Current Erlang monotonic time</fsummary> <desc> <p>Returns the current <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> converted into the <c><anno>Unit</anno></c> passed as argument.</p> <p>Same as calling <seealso marker="#convert_time_unit/3"><c>erlang:convert_time_unit</c></seealso><c>(</c><seealso marker="#monotonic_time/0"><c>erlang:monotonic_time()</c></seealso><c>, native, <anno>Unit</anno>)</c> however optimized for commonly used <c><anno>Unit</anno></c>s.</p> </desc> </func> <func> <name name="nif_error" arity="1"/> <fsummary>Stops execution with a given reason.</fsummary> <desc> <p>Works exactly like <seealso marker="#error/1">erlang:error/1</seealso>, but <c>Dialyzer</c> thinks that this BIF will return an arbitrary term. When used in a stub function for a NIF to generate an exception when the NIF library is not loaded, <c>Dialyzer</c> does not generate false warnings.</p> </desc> </func> <func> <name name="nif_error" arity="2"/> <fsummary>Stops execution with a given reason.</fsummary> <desc> <p>Works exactly like <seealso marker="#error/2">erlang:error/2</seealso>, but <c>Dialyzer</c> thinks that this BIF will return an arbitrary term. When used in a stub function for a NIF to generate an exception when the NIF library is not loaded, <c>Dialyzer</c> does not generate false warnings.</p> </desc> </func> <func> <name name="node" arity="0"/> <fsummary>Name of the local node.</fsummary> <desc> <p>Returns the name of the local node. If the node is not alive, <c>nonode@nohost</c> is returned instead.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="node" arity="1"/> <fsummary>At which node a pid, port, or reference originates.</fsummary> <desc> <p>Returns the node where <c><anno>Arg</anno></c> originates. <c><anno>Arg</anno></c> can be a process identifier, a reference, or a port. If the local node is not alive, <c>nonode@nohost</c> is returned.</p> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="nodes" arity="0"/> <fsummary>All visible nodes in the system.</fsummary> <desc> <p>Returns a list of all visible nodes in the system, except the local node. Same as <c>nodes(visible)</c>.</p> </desc> </func> <func> <name name="nodes" arity="1"/> <fsummary>All nodes of a certain type in the system.</fsummary> <desc> <p>Returns a list of nodes according to the argument given. The returned result when the argument is a list, is the list of nodes satisfying the disjunction(s) of the list elements.</p> <p><c><anno>NodeType</anno></c> can be any of the following:</p> <taglist> <tag><c>visible</c></tag> <item> <p>Nodes connected to this node through normal connections.</p> </item> <tag><c>hidden</c></tag> <item> <p>Nodes connected to this node through hidden connections.</p> </item> <tag><c>connected</c></tag> <item> <p>All nodes connected to this node.</p> </item> <tag><c>this</c></tag> <item> <p>This node.</p> </item> <tag><c>known</c></tag> <item> <p>Nodes that are known to this node. That is, connected nodes and nodes referred to by process identifiers, port identifiers and references located on this node. The set of known nodes is garbage collected. Notice that this garbage collection can be delayed. For more information, see <seealso marker="erlang#system_info_delayed_node_table_gc">delayed_node_table_gc</seealso>. </p> </item> </taglist> <p>Some equalities: <c>[node()] = nodes(this)</c>, <c>nodes(connected) = nodes([visible, hidden])</c>, and <c>nodes() = nodes(visible)</c>.</p> </desc> </func> <func> <name name="now" arity="0"/> <fsummary>Elapsed time since 00:00 GMT.</fsummary> <type name="timestamp"/> <desc> <warning><p><em>This function is deprecated! Do not use it!</em> See the users guide chapter <seealso marker="time_correction">Time and Time Correction</seealso> for more information. Specifically the <seealso marker="time_correction#Dos_and_Donts">Dos and Dont's</seealso> section for information on what to use instead of <c>erlang:now/0</c>. </p></warning> <p>Returns the tuple <c>{MegaSecs, Secs, MicroSecs}</c> which is the elapsed time since 00:00 GMT, January 1, 1970 (zero hour), on the assumption that the underlying OS supports this. Otherwise some other point in time is chosen. It is also guaranteed that subsequent calls to this BIF return continuously increasing values. Hence, the return value from <c>now()</c> can be used to generate unique time-stamps. If it is called in a tight loop on a fast machine, the time of the node can become skewed.</p> <p>Can only be used to check the local time of day if the time-zone information of the underlying OS is properly configured.</p> </desc> </func> <func> <name name="open_port" arity="2"/> <fsummary>Opens a port.</fsummary> <desc> <p>Returns a port identifier as the result of opening a new Erlang port. A port can be seen as an external Erlang process.</p> <p>The name of the executable as well as the arguments given in <c>cd</c>, <c>env</c>, <c>args</c>, and <c>arg0</c> are subject to Unicode file name translation if the system is running in Unicode file name mode. To avoid translation or to force, for example UTF-8, supply the executable and/or arguments as a binary in the correct encoding. For details, see the module <seealso marker="kernel:file">file</seealso>, the function <seealso marker="kernel:file#native_name_encoding/0">file:native_name_encoding/0</seealso>, and the <seealso marker="stdlib:unicode_usage">STDLIB </seealso> User's Guide.</p> <note><p>The characters in the name (if given as a list) can only be higher than 255 if the Erlang Virtual Machine is started in Unicode file name translation mode. Otherwise the name of the executable is limited to the ISO-latin-1 character set.</p></note> <p><c><anno>PortName</anno></c> can be any of the following:</p> <taglist> <tag><c>{spawn, <anno>Command</anno>}</c></tag> <item> <p>Starts an external program. <c><anno>Command</anno></c> is the name of the external program to be run. <c><anno>Command</anno></c> runs outside the Erlang work space unless an Erlang driver with the name <c><anno>Command</anno></c> is found. If found, that driver is started. A driver runs in the Erlang work space, which means that it is linked with the Erlang runtime system.</p> <p>When starting external programs on Solaris, the system call <c>vfork</c> is used in preference to <c>fork</c> for performance reasons, although it has a history of being less robust. If there are problems using <c>vfork</c>, setting environment variable <c>ERL_NO_VFORK</c> to any value causes <c>fork</c> to be used instead.</p> <p>For external programs, <c>PATH</c> is searched (or an equivalent method is used to find programs, depending on OS). This is done by invoking the shell on certain platforms. The first space-separated token of the command is considered as the name of the executable (or driver). This (among other things) makes this option unsuitable for running programs having spaces in file names or directory names. If spaces in executable file names are desired, use <c>{spawn_executable, <anno>Command</anno>}</c> instead.</p> </item> <tag><c>{spawn_driver, <anno>Command</anno>}</c></tag> <item> <p>Works like <c>{spawn, <anno>Command</anno>}</c>, but demands the first (space-separated) token of the command to be the name of a loaded driver. If no driver with that name is loaded, a <c>badarg</c> error is raised.</p> </item> <tag><c>{spawn_executable, <anno>FileName</anno>}</c></tag> <item> <p>Works like <c>{spawn, <anno>FileName</anno>}</c>, but only runs external executables. <c><anno>FileName</anno></c> in its whole is used as the name of the executable, including any spaces. If arguments are to be passed, the <c><anno>PortSettings</anno></c> <c>args</c> and <c>arg0</c> can be used.</p> <p>The shell is usually not invoked to start the program, it is executed directly. <c>PATH</c> (or equivalent) is not searched. To find a program in <c>PATH</c> to execute, use <seealso marker="kernel:os#find_executable/1">os:find_executable/1</seealso>.</p> <p>Only if a shell script or <c>.bat</c> file is executed, the appropriate command interpreter is invoked implicitly, but there is still no command argument expansion or implicit <c>PATH</c> search.</p> <p>If <c><anno>FileName</anno></c> cannot be run, an error exception is raised, with the POSIX error code as the reason. The error reason can differ between OSs. Typically the error <c>enoent</c> is raised when an attempt is made to run a program that is not found and <c>eacces</c> is raised when the given file is not executable.</p> </item> <tag><c>{fd, <anno>In</anno>, <anno>Out</anno>}</c></tag> <item> <p>Allows an Erlang process to access any currently opened file descriptors used by Erlang. The file descriptor <c><anno>In</anno></c> can be used for standard input, and the file descriptor <c><anno>Out</anno></c> for standard output. It is only used for various servers in the Erlang OS (<c>shell</c> and <c>user</c>). Hence, its use is limited.</p> </item> </taglist> <p><c><anno>PortSettings</anno></c> is a list of settings for the port. The valid settings are as follows:</p> <taglist> <tag><c>{packet, <anno>N</anno>}</c></tag> <item> <p>Messages are preceded by their length, sent in <c><anno>N</anno></c> bytes, with the most significant byte first. The valid values for <c>N</c> are 1, 2, and 4.</p> </item> <tag><c>stream</c></tag> <item> <p>Output messages are sent without packet lengths. A user-defined protocol must be used between the Erlang process and the external object.</p> </item> <tag><c>{line, <anno>L</anno>}</c></tag> <item> <p>Messages are delivered on a per line basis. Each line (delimited by the OS-dependent new line sequence) is delivered in a single message. The message data format is <c>{Flag, Line}</c>, where <c>Flag</c> is <c>eol</c> or <c>noeol</c>, and <c>Line</c> is the data delivered (without the new line sequence).</p> <p><c><anno>L</anno></c> specifies the maximum line length in bytes. Lines longer than this are delivered in more than one message, with <c>Flag</c> set to <c>noeol</c> for all but the last message. If end of file is encountered anywhere else than immediately following a new line sequence, the last line is also delivered with <c>Flag</c> set to <c>noeol</c>. Otherwise lines are delivered with <c>Flag</c> set to <c>eol</c>.</p> <p>The <c>{packet, <anno>N</anno>}</c> and <c>{line, <anno>L</anno>}</c> settings are mutually exclusive.</p> </item> <tag><c>{cd, <anno>Dir</anno>}</c></tag> <item> <p>Only valid for <c>{spawn, <anno>Command</anno>}</c> and <c>{spawn_executable, <anno>FileName</anno>}</c>. The external program starts using <c><anno>Dir</anno></c> as its working directory. <c><anno>Dir</anno></c> must be a string.</p> </item> <tag><c>{env, <anno>Env</anno>}</c></tag> <item> <p>Only valid for <c>{spawn, <anno>Command</anno>}</c> and <c>{spawn_executable, <anno>FileName</anno>}</c>. The environment of the started process is extended using the environment specifications in <c><anno>Env</anno></c>.</p> <p><c><anno>Env</anno></c> is to be a list of tuples <c>{<anno>Name</anno>, <anno>Val</anno>}</c>, where <c><anno>Name</anno></c> is the name of an environment variable, and <c><anno>Val</anno></c> is the value it is to have in the spawned port process. Both <c><anno>Name</anno></c> and <c><anno>Val</anno></c> must be strings. The one exception is <c><anno>Val</anno></c> being the atom <c>false</c> (in analogy with <c>os:getenv/1</c>), which removes the environment variable.</p> </item> <tag><c>{args, [ string() | binary() ]}</c></tag> <item> <p>Only valid for <c>{spawn_executable, <anno>FileName</anno>}</c> and specifies arguments to the executable. Each argument is given as a separate string and (on Unix) eventually ends up as one element each in the argument vector. On other platforms, a similar behavior is mimicked.</p> <p>The arguments are not expanded by the shell before being supplied to the executable. Most notably this means that file wild card expansion does not happen. To expand wild cards for the arguments, use <seealso marker="stdlib:filelib#wildcard/1">filelib:wildcard/1</seealso>. Notice that even if the program is a Unix shell script, meaning that the shell ultimately is invoked, wild card expansion does not happen, and the script is provided with the untouched arguments. On Windows, wild card expansion is always up to the program itself, therefore this is not an issue issue.</p> <p>The executable name (also known as <c>argv[0]</c>) is not to be given in this list. The proper executable name is automatically used as argv[0], where applicable.</p> <p>If you explicitly want to set the program name in the argument vector, option <c>arg0</c> can be used.</p> </item> <tag><c>{arg0, string() | binary()}</c></tag> <item> <p>Only valid for <c>{spawn_executable, <anno>FileName</anno>}</c> and explicitly specifies the program name argument when running an executable. This can in some circumstances, on some OSs, be desirable. How the program responds to this is highly system-dependent and no specific effect is guaranteed.</p> </item> <tag><c>exit_status</c></tag> <item> <p>Only valid for <c>{spawn, <anno>Command</anno>}</c>, where <c><anno>Command</anno></c> refers to an external program, and for <c>{spawn_executable, <anno>FileName</anno>}</c>.</p> <p>When the external process connected to the port exits, a message of the form <c>{Port,{exit_status,Status}}</c> is sent to the connected process, where <c>Status</c> is the exit status of the external process. If the program aborts on Unix, the same convention is used as the shells do (that is, 128+signal).</p> <p>If option <c>eof</c> is also given, the messages <c>eof</c> and <c>exit_status</c> appear in an unspecified order.</p> <p>If the port program closes its <c>stdout</c> without exiting, option <c>exit_status</c> does not work.</p> </item> <tag><c>use_stdio</c></tag> <item> <p>Only valid for <c>{spawn, <anno>Command</anno>}</c> and <c>{spawn_executable, <anno>FileName</anno>}</c>. It allows the standard input and output (file descriptors 0 and 1) of the spawned (Unix) process for communication with Erlang.</p> </item> <tag><c>nouse_stdio</c></tag> <item> <p>The opposite of <c>use_stdio</c>. It uses file descriptors 3 and 4 for communication with Erlang.</p> </item> <tag><c>stderr_to_stdout</c></tag> <item> <p>Affects ports to external programs. The executed program gets its standard error file redirected to its standard output file. <c>stderr_to_stdout</c> and <c>nouse_stdio</c> are mutually exclusive.</p> </item> <tag><c>overlapped_io</c></tag> <item> <p>Affects ports to external programs on Windows only. The standard input and standard output handles of the port program are, if this option is supplied, opened with flag <c>FILE_FLAG_OVERLAPPED</c>, so that the port program can (and must) do overlapped I/O on its standard handles. This is not normally the case for simple port programs, but an option of value for the experienced Windows programmer. <em>On all other platforms, this option is silently discarded.</em></p> </item> <tag><c>in</c></tag> <item> <p>The port can only be used for input.</p> </item> <tag><c>out</c></tag> <item> <p>The port can only be used for output.</p> </item> <tag><c>binary</c></tag> <item> <p>All I/O from the port is binary data objects as opposed to lists of bytes.</p> </item> <tag><c>eof</c></tag> <item> <p>The port is not closed at the end of the file and does not produce an exit signal. Instead, it remains open and a <c>{Port, eof}</c> message is sent to the process holding the port.</p> </item> <tag><c>hide</c></tag> <item> <p>When running on Windows, suppresses creation of a new console window when spawning the port program. (This option has no effect on other platforms.)</p> </item> <tag><c>{parallelism, Boolean}</c></tag> <item> <marker id="open_port_parallelism"></marker> <p>Sets scheduler hint for port parallelism. If set to <c>true</c>, the Virtual Machine schedules port tasks; when doing so, it improves parallelism in the system. If set to <c>false</c>, the Virtual Machine tries to perform port tasks immediately, improving latency at the expense of parallelism. The default can be set at system startup by passing command-line argument <seealso marker="erl#+spp">+spp</seealso> to <c>erl(1)</c>.</p> </item> </taglist> <p>Default is <c>stream</c> for all port types and <c>use_stdio</c> for spawned ports.</p> <p>Failure: If the port cannot be opened, the exit reason is <c>badarg</c>, <c>system_limit</c>, or the POSIX error code that most closely describes the error, or <c>einval</c> if no POSIX code is appropriate:</p> <taglist> <tag><c>badarg</c></tag> <item>Bad input arguments to <c>open_port</c>. </item> <tag><c>system_limit</c></tag> <item>All available ports in the Erlang emulator are in use. </item> <tag><c>enomem</c></tag> <item>Not enough memory to create the port. </item> <tag><c>eagain</c></tag> <item>No more available OS processes. </item> <tag><c>enametoolong</c></tag> <item>Too long external command. </item> <tag><c>emfile</c></tag> <item>No more available file descriptors (for the OS process that the Erlang emulator runs in). </item> <tag><c>enfile</c></tag> <item>Full file table (for the entire OS). </item> <tag><c>eacces</c></tag> <item><c>Command</c> given in <c>{spawn_executable, Command}</c> does not point out an executable file. </item> <tag><c>enoent</c></tag> <item><c><anno>FileName</anno></c> given in <c>{spawn_executable, <anno>FileName</anno>}</c> does not point out an existing file. </item> </taglist> <p>During use of a port opened using <c>{spawn, Name}</c>, <c>{spawn_driver, Name}</c>, or <c>{spawn_executable, Name}</c>, errors arising when sending messages to it are reported to the owning process using signals of the form <c>{'EXIT', Port, PosixCode}</c>. For the possible values of <c>PosixCode</c>, see the <seealso marker="kernel:file">file(3)</seealso> manual page in <c>Kernel</c>.</p> <p>The maximum number of ports that can be open at the same time can be configured by passing command-line flag <seealso marker="erl#max_ports"><c>+Q</c></seealso> to <c>erl(1)</c>.</p> </desc> </func> <func> <name name="phash" arity="2"/> <fsummary>Portable hash function.</fsummary> <type_desc variable="Range">Range = 1..2^32, Hash = 1..Range</type_desc> <desc> <p>Portable hash function that gives the same hash for the same Erlang term regardless of machine architecture and <c>ERTS</c> version (the BIF was introduced in <c>ERTS</c> 4.9.1.1). The function returns a hash value for <c><anno>Term</anno></c> within the range <c>1..<anno>Range</anno></c>. The maximum value for <c><anno>Range</anno></c> is 2^32.</p> <p>This BIF can be used instead of the old deprecated BIF <c>erlang:hash/2</c>, as it calculates better hashes for all data types, but consider using <c>phash2/1,2</c> instead.</p> </desc> </func> <func> <name name="phash2" arity="1"/> <name name="phash2" arity="2"/> <fsummary>Portable hash function.</fsummary> <type_desc variable="Range">1..2^32</type_desc> <type_desc variable="Hash">0..Range-1</type_desc> <desc> <p>Portable hash function that gives the same hash for the same Erlang term regardless of machine architecture and <c>ERTS</c> version (the BIF was introduced in <c>ERTS</c> 5.2). The function returns a hash value for <c><anno>Term</anno></c> within the range <c>0..<anno>Range</anno>-1</c>. The maximum value for <c><anno>Range</anno></c> is 2^32. When without argument <c><anno>Range</anno></c>, a value in the range 0..2^27-1 is returned.</p> <p>This BIF is always to be used for hashing terms. It distributes small integers better than <c>phash/2</c>, and it is faster for bignums and binaries.</p> <p>Notice that the range <c>0..<anno>Range</anno>-1</c> is different from the range of <c>phash/2</c>, which is <c>1..<anno>Range</anno></c>.</p> </desc> </func> <func> <name name="pid_to_list" arity="1"/> <fsummary>Text representation of a pid.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Pid</anno></c>.</p> <warning> <p>This BIF is intended for debugging and is not to be used in application programs.</p> </warning> </desc> </func> <func> <name name="port_close" arity="1"/> <fsummary>Closes an open port.</fsummary> <desc> <p>Closes an open port. Roughly the same as <c><anno>Port</anno> ! {self(), close}</c> except for the error behavior (see the following), being synchronous, and that the port does <em>not</em> reply with <c>{Port, closed}</c>. Any process can close a port with <c>port_close/1</c>, not only the port owner (the connected process). If the calling process is linked to the port identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before <c>port_close/1</c> returns.</p> <p>For comparison: <c><anno>Port</anno> ! {self(), close}</c> only fails with <c>badarg</c> if <c><anno>Port</anno></c> does not refer to a port or a process. If <c><anno>Port</anno></c> is a closed port, nothing happens. If <c><anno>Port</anno></c> is an open port and the calling process is the port owner, the port replies with <c>{Port, closed}</c> when all buffers have been flushed and the port really closes. If the calling process is not the port owner, the <em>port owner</em> fails with <c>badsig</c>.</p> <p>Notice that any process can close a port using <c><anno>Port</anno> ! {PortOwner, close}</c> as if it itself was the port owner, but the reply always goes to the port owner.</p> <p>As from OTP R16, <c><anno>Port</anno> ! {PortOwner, close}</c> is truly asynchronous. Notice that this operation has always been documented as an asynchronous operation, while the underlying implementation has been synchronous. <c>port_close/1</c> is however still fully synchronous. This because of its error behavior.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not an identifier of an open port, or the registered name of an open port. If the calling process was previously linked to the closed port, identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before this <c>badarg</c> exception occurs.</p> </desc> </func> <func> <name name="port_command" arity="2"/> <fsummary>Sends data to a port.</fsummary> <desc> <p>Sends data to a port. Same as <c><anno>Port</anno> ! {PortOwner, {command, Data}}</c> except for the error behavior and being synchronous (see the following). Any process can send data to a port with <c>port_command/2</c>, not only the port owner (the connected process).</p> <p>For comparison: <c><anno>Port</anno> ! {PortOwner, {command, Data}}</c> only fails with <c>badarg</c> if <c><anno>Port</anno></c> does not refer to a port or a process. If <c><anno>Port</anno></c> is a closed port, the data message disappears without a sound. If <c><anno>Port</anno></c> is open and the calling process is not the port owner, the <em>port owner</em> fails with <c>badsig</c>. The port owner fails with <c>badsig</c> also if <c><anno>Data</anno></c> is an invalid I/O list.</p> <p>Notice that any process can send to a port using <c><anno>Port</anno> ! {PortOwner, {command, <anno>Data</anno>}}</c> as if it itself was the port owner.</p> <p>If the port is busy, the calling process is suspended until the port is not busy any more.</p> <p>As from OTP-R16, <c><anno>Port</anno> ! {PortOwner, {command, Data}}</c> is truly asynchronous. Notice that this operation has always been documented as an asynchronous operation, while the underlying implementation has been synchronous. <c>port_command/2</c> is however still fully synchronous. This because of its error behavior.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Port</anno></c> is not an identifier of an open port, or the registered name of an open port. If the calling process was previously linked to the closed port, identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before this <c>badarg</c> exception occurs. </item> <tag><c>badarg</c></tag> <item> If <c><anno>Data</anno></c> is an invalid I/O list. </item> </taglist> </desc> </func> <func> <name name="port_command" arity="3"/> <fsummary>Sends data to a port.</fsummary> <desc> <p>Sends data to a port. <c>port_command(Port, Data, [])</c> equals <c>port_command(Port, Data)</c>.</p> <p>If the port command is aborted, <c>false</c> is returned, otherwise <c>true</c>.</p> <p>If the port is busy, the calling process is suspended until the port is not busy any more.</p> <p>The following <c><anno>Option</anno></c>s are valid:</p> <taglist> <tag><c>force</c></tag> <item>The calling process is not suspended if the port is busy, instead the port command is forced through. The call fails with a <c>notsup</c> exception if the driver of the port does not support this. For more information, see driver flag <seealso marker="driver_entry#driver_flags"><![CDATA[ERL_DRV_FLAG_SOFT_BUSY]]></seealso>. </item> <tag><c>nosuspend</c></tag> <item>The calling process is not suspended if the port is busy, instead the port command is aborted and <c>false</c> is returned. </item> </taglist> <note> <p>More options can be added in a future release.</p> </note> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Port</anno></c> is not an identifier of an open port, or the registered name of an open port. If the calling process was previously linked to the closed port, identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before this <c>badarg</c> exception occurs. </item> <tag><c>badarg</c></tag> <item> If <c><anno>Data</anno></c> is an invalid I/O list. </item> <tag><c>badarg</c></tag> <item> If <c><anno>OptionList</anno></c> is an invalid option list. </item> <tag><c>notsup</c></tag> <item> If option <c>force</c> has been passed, but the driver of the port does not allow forcing through a busy port. </item> </taglist> </desc> </func> <func> <name name="port_connect" arity="2"/> <fsummary>Sets the owner of a port.</fsummary> <desc> <p>Sets the port owner (the connected port) to <c><anno>Pid</anno></c>. Roughly the same as <c><anno>Port</anno> ! {Owner, {connect, <anno>Pid</anno>}}</c> except for the following:</p> <list type="bulleted"> <item> <p>The error behavior differs, see the following.</p> </item> <item> <p>The port does <em>not</em> reply with <c>{Port,connected}</c>.</p> </item> <item> <p><c>port_connect/1</c> is synchronous, see the following.</p> </item> <item> <p>The new port owner gets linked to the port.</p> </item> </list> <p>The old port owner stays linked to the port and must call <c>unlink(Port)</c> if this is not desired. Any process can set the port owner to be any process with <c>port_connect/2</c>.</p> <p>For comparison: <c><anno>Port</anno> ! {self(), {connect, <anno>Pid</anno>}}</c> only fails with <c>badarg</c> if <c><anno>Port</anno></c> does not refer to a port or a process. If <c><anno>Port</anno></c> is a closed port, nothing happens. If <c><anno>Port</anno></c> is an open port and the calling process is the port owner, the port replies with <c>{Port, connected}</c> to the old port owner. Notice that the old port owner is still linked to the port, while the new is not. If <c><anno>Port</anno></c> is an open port and the calling process is not the port owner, the <em>port owner</em> fails with <c>badsig</c>. The port owner fails with <c>badsig</c> also if <c><anno>Pid</anno></c> is not an existing local process identifier.</p> <p>Notice that any process can set the port owner using <c><anno>Port</anno> ! {PortOwner, {connect, <anno>Pid</anno>}}</c> as if it itself was the port owner, but the reply always goes to the port owner.</p> <p>As from OTP-R16, <c><anno>Port</anno> ! {PortOwner, {connect, <anno>Pid</anno>}}</c> is truly asynchronous. Notice that this operation has always been documented as an asynchronous operation, while the underlying implementation has been synchronous. <c>port_connect/2</c> is however still fully synchronous. This because of its error behavior.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Port</anno></c> is not an identifier of an open port, or the registered name of an open port. If the calling process was previously linked to the closed port, identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before this <c>badarg</c> exception occurs. </item> <tag><c>badarg</c></tag> <item>If process identified by <c>Pid</c> is not an existing local process.</item> </taglist> </desc> </func> <func> <name name="port_control" arity="3"/> <fsummary>Performs a synchronous control operation on a port.</fsummary> <desc> <p>Performs a synchronous control operation on a port. The meaning of <c><anno>Operation</anno></c> and <c><anno>Data</anno></c> depends on the port, that is, on the port driver. Not all port drivers support this control feature.</p> <p>Returns a list of integers in the range 0..255, or a binary, depending on the port driver. The meaning of the returned data also depends on the port driver.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Port</anno></c> is not an open port or the registered name of an open port. </item> <tag><c>badarg</c></tag> <item> If <c><anno>Operation</anno></c> cannot fit in a 32-bit integer. </item> <tag><c>badarg</c></tag> <item> If the port driver does not support synchronous control operations. </item> <tag><c>badarg</c></tag> <item> If the port driver so decides for any reason (probably something wrong with <c><anno>Operation</anno></c> or <c><anno>Data</anno></c>). </item> </taglist> </desc> </func> <func> <name name="port_call" arity="3"/> <fsummary>Performs a synchronous call to a port with term data.</fsummary> <desc> <p>Performs a synchronous call to a port. The meaning of <c><anno>Operation</anno></c> and <c><anno>Data</anno></c> depends on the port, that is, on the port driver. Not all port drivers support this feature.</p> <p><c><anno>Port</anno></c> is a port identifier, referring to a driver.</p> <p><c><anno>Operation</anno></c> is an integer, which is passed on to the driver.</p> <p><c><anno>Data</anno></c> is any Erlang term. This data is converted to binary term format and sent to the port.</p> <p>Returns a term from the driver. The meaning of the returned data also depends on the port driver.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Port</anno></c> is not an identifier of an open port, or the registered name of an open port. If the calling process was previously linked to the closed port, identified by <c><anno>Port</anno></c>, the exit signal from the port is guaranteed to be delivered before this <c>badarg</c> exception occurs. </item> <tag><c>badarg</c></tag> <item> If <c><anno>Operation</anno></c> does not fit in a 32-bit integer. </item> <tag><c>badarg</c></tag> <item> If the port driver does not support synchronous control operations. </item> <tag><c>badarg</c></tag> <item> If the port driver so decides for any reason (probably something wrong with <c><anno>Operation</anno></c> or <c><anno>Data</anno></c>). </item> </taglist> </desc> </func> <func> <name name="port_info" arity="1"/> <fsummary>Information about a port.</fsummary> <desc> <p>Returns a list containing tuples with information about <c><anno>Port</anno></c>, or <c>undefined</c> if the port is not open. The order of the tuples is undefined, and all the tuples are not mandatory. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/1</c> returns <c>undefined</c>.</p> <p>The result contains information about the following <c>Item</c>s:</p> <list type="bulleted"> <item><c>registered_name</c> (if the port has a registered name)</item> <item><c>id</c></item> <item><c>connected</c></item> <item><c>links</c></item> <item><c>name</c></item> <item><c>input</c></item> <item><c>output</c></item> </list> <p>For more information about the different <c>Item</c>s, see <seealso marker="#port_info/2">port_info/2</seealso>.</p> <p>Failure: <c>badarg</c> if <c>Port</c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="1"/> <fsummary>Information about the connected process of a port.</fsummary> <desc> <p><c><anno>Pid</anno></c> is the process identifier of the process connected to the port.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="2"/> <fsummary>Information about the internal index of a port.</fsummary> <desc> <p><c><anno>Index</anno></c> is the internal index of the port. This index can be used to separate ports.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="3"/> <fsummary>Information about the input of a port.</fsummary> <desc> <p><c><anno>Bytes</anno></c> is the total number of bytes read from the port.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="4"/> <fsummary>Information about the links of a port.</fsummary> <desc> <p><c><anno>Pids</anno></c> is a list of the process identifiers of the processes that the port is linked to.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="5"/> <fsummary>Information about the locking of a port.</fsummary> <desc> <p><c><anno>Locking</anno></c> is one of the following:</p> <list type="bulleted"> <item><c>false</c> (emulator without SMP support)</item> <item><c>port_level</c> (port-specific locking)</item> <item><c>driver_level</c> (driver-specific locking)</item> </list> <p>Notice that these results are highly implementation-specific and can change in a future release.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="6"/> <fsummary>Information about the memory size of a port.</fsummary> <desc> <p><c><anno>Bytes</anno></c> is the total number of bytes allocated for this port by the runtime system. The port itself can have allocated memory that is not included in <c><anno>Bytes</anno></c>.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="7"/> <fsummary>Information about the monitors of a port.</fsummary> <desc> <p><c><anno>Monitors</anno></c> represent processes that this port monitors.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="8"/> <fsummary>Information about the name of a port.</fsummary> <desc> <p><c><anno>Name</anno></c> is the command name set by <seealso marker="#open_port/2">open_port/2</seealso>.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="9"/> <fsummary>Information about the OS pid of a port.</fsummary> <desc> <p><c><anno>OsPid</anno></c> is the process identifier (or equivalent) of an OS process created with <seealso marker="#open_port/2">open_port({spawn | spawn_executable, Command}, Options)</seealso>. If the port is not the result of spawning an OS process, the value is <c>undefined</c>.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="10"/> <fsummary>Information about the output of a port.</fsummary> <desc> <p><c><anno>Bytes</anno></c> is the total number of bytes written to the port from Erlang processes using <seealso marker="#port_command/2">port_command/2</seealso>, <seealso marker="#port_command/3">port_command/3</seealso>, or <c><anno>Port</anno> ! {Owner, {command, Data}</c>.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="11"/> <fsummary>Information about the parallelism hint of a port.</fsummary> <desc> <p><c><anno>Boolean</anno></c> corresponds to the port parallelism hint being used by this port. For more information, see option <seealso marker="#open_port_parallelism">parallelism</seealso> of <seealso marker="#open_port/2">open_port/2</seealso>.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="12"/> <fsummary>Information about the queue size of a port.</fsummary> <desc> <p><c><anno>Bytes</anno></c> is the total number of bytes queued by the port using the <c>ERTS</c> driver queue implementation.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_info" arity="2" clause_i="13"/> <fsummary>Information about the registered name of a port.</fsummary> <desc> <p><c><anno>RegisteredName</anno></c> is the registered name of the port. If the port has no registered name, <c>[]</c> is returned.</p> <p>If the port identified by <c><anno>Port</anno></c> is not open, <c>undefined</c> is returned. If the port is closed and the calling process was previously linked to the port, the exit signal from the port is guaranteed to be delivered before <c>port_info/2</c> returns <c>undefined</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Port</anno></c> is not a local port identifier, or an atom.</p> </desc> </func> <func> <name name="port_to_list" arity="1"/> <fsummary>Text representation of a port identifier.</fsummary> <desc> <p>Returns a string corresponding to the text representation of the port identifier <c><anno>Port</anno></c>.</p> <warning> <p>This BIF is intended for debugging. It is not to be used in application programs.</p> </warning> </desc> </func> <func> <name name="ports" arity="0"/> <fsummary>Lists all existing ports.</fsummary> <desc> <p>Returns a list of port identifiers corresponding to all the ports existing on the local node.</p> <p>Notice that an exiting port exists, but is not open.</p> </desc> </func> <func> <name name="pre_loaded" arity="0"/> <fsummary>Lists all pre-loaded modules.</fsummary> <desc> <p>Returns a list of Erlang modules that are preloaded in the system. As all loading of code is done through the file system, the file system must have been loaded previously. Hence, at least the module <c>init</c> must be preloaded.</p> </desc> </func> <func> <name name="process_display" arity="2"/> <fsummary>Writes information about a local process on standard error.</fsummary> <desc> <p>Writes information about the local process <c><anno>Pid</anno></c> on standard error. The only allowed value for the atom <c><anno>Type</anno></c> is <c>backtrace</c>, which shows the contents of the call stack, including information about the call chain, with the current function printed first. The format of the output is not further defined.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="1"/> <fsummary>Sets process flag <c>trap_exit</c> for the calling process.</fsummary> <desc> <p>When <c>trap_exit</c> is set to <c>true</c>, exit signals arriving to a process are converted to <c>{'EXIT', From, Reason}</c> messages, which can be received as ordinary messages. If <c>trap_exit</c> is set to <c>false</c>, the process exits if it receives an exit signal other than <c>normal</c> and the exit signal is propagated to its linked processes. Application processes are normally not to trap exits.</p> <p>Returns the old value of the flag.</p> <p>See also <seealso marker="#exit/2">exit/2</seealso>.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="2"/> <fsummary>Sets process flag <c>error_handler</c> for the calling process.</fsummary> <desc> <p>Used by a process to redefine the error handler for undefined function calls and undefined registered processes. Inexperienced users are not to use this flag, as code auto-loading depends on the correct operation of the error handling module.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="3"/> <fsummary>Sets process flag <c>min_heap_size</c> for the calling process.</fsummary> <desc> <p>Changes the minimum heap size for the calling process.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="4"/> <fsummary>Sets process flag <c>min_bin_vheap_size</c> for the calling process.</fsummary> <desc> <p>Changes the minimum binary virtual heap size for the calling process.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="5"/> <fsummary>Sets process flag <c>priority</c> for the calling process.</fsummary> <type name="priority_level"/> <desc> <p><marker id="process_flag_priority"></marker> Sets the process priority. <c><anno>Level</anno></c> is an atom. There are four priority levels: <c>low</c>, <c>normal</c>, <c>high</c>, and <c>max</c>. Default is <c>normal</c>.</p> <note> <p>Priority level <c>max</c> is reserved for internal use in the Erlang runtime system, and is <em>not</em> to be used by others.</p> </note> <p>Internally in each priority level, processes are scheduled in a round robin fashion.</p> <p>Execution of processes on priority <c>normal</c> and <c>low</c> are interleaved. Processes on priority <c>low</c> are selected for execution less frequently than processes on priority <c>normal</c>.</p> <p>When there are runnable processes on priority <c>high</c>, no processes on priority <c>low</c> or <c>normal</c> are selected for execution. Notice however, that this does <em>not</em> mean that no processes on priority <c>low</c> or <c>normal</c> can run when there are processes running on priority <c>high</c>. On the runtime system with SMP support, more processes can be running in parallel than processes on priority <c>high</c>, that is, a <c>low</c> and a <c>high</c> priority process can execute at the same time.</p> <p>When there are runnable processes on priority <c>max</c>, no processes on priority <c>low</c>, <c>normal</c>, or <c>high</c> are selected for execution. As with priority <c>high</c>, processes on lower priorities can execute in parallel with processes on priority <c>max</c>.</p> <p>Scheduling is preemptive. Regardless of priority, a process is preempted when it has consumed more than a certain number of reductions since the last time it was selected for execution.</p> <note> <p>Do not depend on the scheduling to remain exactly as it is today. Scheduling, at least on the runtime system with SMP support, is likely to be changed in a future release to use available processor cores better.</p> </note> <p>There is <em>no</em> automatic mechanism for avoiding priority inversion, such as priority inheritance or priority ceilings. When using priorities, take this into account and handle such scenarios by yourself.</p> <p>Making calls from a <c>high</c> priority process into code that you have no control over can cause the <c>high</c> priority process to wait for a process with lower priority. That is, effectively decreasing the priority of the <c>high</c> priority process during the call. Even if this is not the case with one version of the code that you have no control over, it can be the case in a future version of it. This can, for example, occur if a <c>high</c> priority process triggers code loading, as the code server runs on priority <c>normal</c>.</p> <p>Other priorities than <c>normal</c> are normally not needed. When other priorities are used, use them with care, <em>especially</em> priority <c>high</c>. A process on priority <c>high</c> is only to perform work for short periods. Busy looping for long periods in a <c>high</c> priority process does most likely cause problems, as important OTP servers run on priority <c>normal</c>.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="6"/> <fsummary>Sets process flag <c>save_calls</c> for the calling process.</fsummary> <desc> <p><c><anno>N</anno></c> must be an integer in the interval 0..10000. If <c><anno>N</anno></c> is greater than 0, call saving is made active for the process. This means that information about the <c><anno>N</anno></c> most recent global function calls, BIF calls, sends, and receives made by the process are saved in a list, which can be retrieved with <c>process_info(Pid, last_calls)</c>. A global function call is one in which the module of the function is explicitly mentioned. Only a fixed amount of information is saved, as follows:</p> <list type="bulleted"> <item>A tuple <c>{Module, Function, Arity}</c> for function calls</item> <item> The atoms <c>send</c>, <c>'receive'</c>, and <c>timeout</c> for sends and receives (<c>'receive'</c> when a message is received and <c>timeout</c> when a receive times out)</item> </list> <p>If <c>N</c> = 0, call saving is disabled for the process, which is the default. Whenever the size of the call saving list is set, its contents are reset.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="2" clause_i="7"/> <fsummary>Sets process flag <c>sensitive</c> for the calling process.</fsummary> <desc> <p>Sets or clears flag <c>sensitive</c> for the current process. When a process has been marked as sensitive by calling <c>process_flag(sensitive, true)</c>, features in the runtime system that can be used for examining the data or inner working of the process are silently disabled.</p> <p>Features that are disabled include (but are not limited to) the following:</p> <list type="bulleted"> <item>Tracing: Trace flags can still be set for the process, but no trace messages of any kind are generated. (If flag <c>sensitive</c> is turned off, trace messages are again generated if any trace flags are set.)</item> <item>Sequential tracing: The sequential trace token is propagated as usual, but no sequential trace messages are generated.</item> </list> <p><c>process_info/1,2</c> cannot be used to read out the message queue or the process dictionary (both are returned as empty lists).</p> <p>Stack back-traces cannot be displayed for the process.</p> <p>In crash dumps, the stack, messages, and the process dictionary are omitted.</p> <p>If <c>{save_calls,N}</c> has been set for the process, no function calls are saved to the call saving list. (The call saving list is not cleared. Furthermore, send, receive, and timeout events are still added to the list.)</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="process_flag" arity="3"/> <fsummary>Sets process flags for a process.</fsummary> <desc> <p>Sets certain flags for the process <c><anno>Pid</anno></c>, in the same manner as <seealso marker="#process_flag/2">process_flag/2</seealso>. Returns the old value of the flag. The valid values for <c><anno>Flag</anno></c> are only a subset of those allowed in <c>process_flag/2</c>, namely <c>save_calls</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Pid</anno></c> is not a local process.</p> </desc> </func> <func> <name name="process_info" arity="1"/> <fsummary>Information about a process.</fsummary> <type name="process_info_result_item"/> <type name="priority_level"/> <type name="stack_item"/> <desc> <p>Returns a list containing <c><anno>InfoTuple</anno></c>s with miscellaneous information about the process identified by <c>Pid</c>, or <c>undefined</c> if the process is not alive.</p> <p>The order of the <c><anno>InfoTuple</anno></c>s is undefined and all <c><anno>InfoTuple</anno></c>s are not mandatory. The <c><anno>InfoTuple</anno></c>s part of the result can be changed without prior notice.</p> <p>The <c><anno>InfoTuple</anno></c>s with the following items are part of the result:</p> <list type="bulleted"> <item><c>current_function</c></item> <item><c>initial_call</c></item> <item><c>status</c></item> <item><c>message_queue_len</c></item> <item><c>messages</c></item> <item><c>links</c></item> <item><c>dictionary</c></item> <item><c>trap_exit</c></item> <item><c>error_handler</c></item> <item><c>priority</c></item> <item><c>group_leader</c></item> <item><c>total_heap_size</c></item> <item><c>heap_size</c></item> <item><c>stack_size</c></item> <item><c>reductions</c></item> <item><c>garbage_collection</c></item> </list> <p>If the process identified by <c><anno>Pid</anno></c> has a registered name, also an <c><anno>InfoTuple</anno></c> with item <c>registered_name</c> appears.</p> <p>For information about specific <c><anno>InfoTuple</anno></c>s, see <seealso marker="#process_info/2">process_info/2</seealso>.</p> <warning> <p>This BIF is intended for <em>debugging only</em>. For all other purposes, use <seealso marker="#process_info/2">process_info/2</seealso>.</p> </warning> <p>Failure: <c>badarg</c> if <c><anno>Pid</anno></c> is not a local process.</p> </desc> </func> <func> <name name="process_info" arity="2" clause_i="1"/> <name name="process_info" arity="2" clause_i="2"/> <fsummary>Information about a process.</fsummary> <type name="process_info_item"/> <type name="process_info_result_item"/> <type name="stack_item"/> <type name="priority_level"/> <desc> <p>Returns information about the process identified by <c><anno>Pid</anno></c>, as specified by <c><anno>Item</anno></c> or <c><anno>ItemList</anno></c>. Returns <c>undefined</c> if the process is not alive.</p> <p>If the process is alive and a single <c><anno>Item</anno></c> is given, the returned value is the corresponding <c><anno>InfoTuple</anno></c>, unless <c>Item =:= registered_name</c> and the process has no registered name. In this case, <c>[]</c> is returned. This strange behavior is because of historical reasons, and is kept for backward compatibility.</p> <p>If <c><anno>ItemList</anno></c> is given, the result is <c><anno>InfoTupleList</anno></c>. The <c><anno>InfoTuple</anno></c>s in <c><anno>InfoTupleList</anno></c> appear with the corresponding <c><anno>Item</anno></c>s in the same order as the <c><anno>Item</anno></c>s appeared in <c><anno>ItemList</anno></c>. Valid <c><anno>Item</anno></c>s can appear multiple times in <c><anno>ItemList</anno></c>.</p> <note><p>If <c>registered_name</c> is part of <c><anno>ItemList</anno></c> and the process has no name registered a <c>{registered_name, []}</c>, <c><anno>InfoTuple</anno></c> <em>will</em> appear in the resulting <c><anno>InfoTupleList</anno></c>. This behavior is different when a single <c>Item =:= registered_name</c> is given, and when <c>process_info/1</c> is used.</p> </note> <p>The following <c><anno>InfoTuple</anno></c>s with corresponding <c><anno>Item</anno></c>s are valid:</p> <taglist> <tag><c>{backtrace, <anno>Bin</anno>}</c></tag> <item> <p>Binary <c><anno>Bin</anno></c> contains the same information as the output from <c>erlang:process_display(<anno>Pid</anno>, backtrace)</c>. Use <c>binary_to_list/1</c> to obtain the string of characters from the binary.</p> </item> <tag><c>{binary, <anno>BinInfo</anno>}</c></tag> <item> <p><c><anno>BinInfo</anno></c> is a list containing miscellaneous information about binaries currently being referred to by this process. This <c><anno>InfoTuple</anno></c> can be changed or removed without prior notice.</p> </item> <tag><c>{catchlevel, <anno>CatchLevel</anno>}</c></tag> <item> <p><c><anno>CatchLevel</anno></c> is the number of currently active catches in this process. This <c><anno>InfoTuple</anno></c> can be changed or removed without prior notice.</p> </item> <tag><c>{current_function, {<anno>Module</anno>, <anno>Function</anno>, Arity}}</c></tag> <item> <p><c><anno>Module</anno></c>, <c><anno>Function</anno></c>, <c><anno>Arity</anno></c> is the current function call of the process.</p> </item> <tag><c>{current_location, {<anno>Module</anno>, <anno>Function</anno>, <anno>Arity</anno>, <anno>Location</anno>}}</c></tag> <item> <p><c><anno>Module</anno></c>, <c><anno>Function</anno></c>, <c><anno>Arity</anno></c> is the current function call of the process. <c><anno>Location</anno></c> is a list of two-tuples describing the location in the source code.</p> </item> <tag><c>{current_stacktrace, <anno>Stack</anno>}</c></tag> <item> <p>Returns the current call stack back-trace (<em>stacktrace</em>) of the process. The stack has the same format as returned by <seealso marker="#get_stacktrace/0">erlang:get_stacktrace/0</seealso>.</p> </item> <tag><c>{dictionary, <anno>Dictionary</anno>}</c></tag> <item> <p><c><anno>Dictionary</anno></c> is the process dictionary.</p> </item> <tag><c>{error_handler, <anno>Module</anno>}</c></tag> <item> <p><c><anno>Module</anno></c> is the error handler module used by the process (for undefined function calls, for example).</p> </item> <tag><c>{garbage_collection, <anno>GCInfo</anno>}</c></tag> <item> <p><c><anno>GCInfo</anno></c> is a list containing miscellaneous information about garbage collection for this process. The content of <c><anno>GCInfo</anno></c> can be changed without prior notice.</p> </item> <tag><c>{group_leader, <anno>GroupLeader</anno>}</c></tag> <item> <p><c><anno>GroupLeader</anno></c> is group leader for the I/O of the process.</p> </item> <tag><c>{heap_size, <anno>Size</anno>}</c></tag> <item> <p><c><anno>Size</anno></c> is the size in words of the youngest heap generation of the process. This generation includes the process stack. This information is highly implementation-dependent, and can change if the implementation changes.</p> </item> <tag><c>{initial_call, {<anno>Module</anno>, <anno>Function</anno>, <anno>Arity</anno>}}</c></tag> <item> <p><c><anno>Module</anno></c>, <c><anno>Function</anno></c>, <c><anno>Arity</anno></c> is the initial function call with which the process was spawned.</p> </item> <tag><c>{links, <anno>PidsAndPorts</anno>}</c></tag> <item> <p><c><anno>PidsAndPorts</anno></c> is a list of process identifiers and port identifiers, with processes or ports to which the process has a link.</p> </item> <tag><c>{last_calls, false|Calls}</c></tag> <item> <p>The value is <c>false</c> if call saving is not active for the process (see <seealso marker="#process_flag/3">process_flag/3</seealso>). If call saving is active, a list is returned, in which the last element is the most recent called.</p> </item> <tag><c>{memory, <anno>Size</anno>}</c></tag> <item> <p><c><anno>Size</anno></c> is the size in bytes of the process. This includes call stack, heap, and internal structures.</p> </item> <tag><c>{message_queue_len, <anno>MessageQueueLen</anno>}</c></tag> <item> <p><c><anno>MessageQueueLen</anno></c> is the number of messages currently in the message queue of the process. This is the length of the list <c><anno>MessageQueue</anno></c> returned as the information item <c>messages</c> (see the following).</p> </item> <tag><c>{messages, <anno>MessageQueue</anno>}</c></tag> <item> <p><c><anno>MessageQueue</anno></c> is a list of the messages to the process, which have not yet been processed.</p> </item> <tag><c>{min_heap_size, <anno>MinHeapSize</anno>}</c></tag> <item> <p><c><anno>MinHeapSize</anno></c> is the minimum heap size for the process.</p> </item> <tag><c>{min_bin_vheap_size, <anno>MinBinVHeapSize</anno>}</c></tag> <item> <p><c><anno>MinBinVHeapSize</anno></c> is the minimum binary virtual heap size for the process.</p> </item> <tag><c>{monitored_by, <anno>Pids</anno>}</c></tag> <item> <p>A list of process identifiers monitoring the process (with <c>monitor/2</c>).</p> </item> <tag><c>{monitors, <anno>Monitors</anno>}</c></tag> <item> <p>A list of monitors (started by <c>monitor/2</c>) that are active for the process. For a local process monitor or a remote process monitor by a process identifier, the list item is <c>{process, <anno>Pid</anno>}</c>. For a remote process monitor by name, the list item is <c>{process, {<anno>RegName</anno>, <anno>Node</anno>}}</c>.</p> </item> <tag><c>{priority, <anno>Level</anno>}</c></tag> <item> <p><c><anno>Level</anno></c> is the current priority level for the process. For more information on priorities, see <seealso marker="#process_flag_priority">process_flag(priority, Level)</seealso>.</p> </item> <tag><c>{reductions, <anno>Number</anno>}</c></tag> <item> <p><c><anno>Number</anno></c> is the number of reductions executed by the process.</p> </item> <tag><c>{registered_name, <anno>Atom</anno>}</c></tag> <item> <p><c><anno>Atom</anno></c> is the registered name of the process. If the process has no registered name, this tuple is not present in the list.</p> </item> <tag><c>{sequential_trace_token, [] | <anno>SequentialTraceToken</anno>}</c></tag> <item> <p><c><anno>SequentialTraceToken</anno></c> is the sequential trace token for the process. This <c><anno>InfoTuple</anno></c> can be changed or removed without prior notice.</p> </item> <tag><c>{stack_size, <anno>Size</anno>}</c></tag> <item> <p><c><anno>Size</anno></c> is the stack size, in words, of the process.</p> </item> <tag><c>{status, <anno>Status</anno>}</c></tag> <item> <p><c><anno>Status</anno></c> is the status of the process and is one of the following:</p> <list type="bulleted"> <item><c>exiting</c></item> <item><c>garbage_collecting</c></item> <item><c>waiting</c> (for a message)</item> <item><c>running</c></item> <item><c>runnable</c> (ready to run, but another process is running)</item> <item><c>suspended</c> (suspended on a "busy" port or by the BIF <c>erlang:suspend_process/[1,2]</c>)</item> </list> </item> <tag><c>{suspending, <anno>SuspendeeList</anno>}</c></tag> <item> <p><c><anno>SuspendeeList</anno></c> is a list of <c>{<anno>Suspendee</anno>, <anno>ActiveSuspendCount</anno>, <anno>OutstandingSuspendCount</anno>}</c> tuples. <c><anno>Suspendee</anno></c> is the process identifier of a process that has been, or is to be, suspended by the process identified by <c><anno>Pid</anno></c> through one of the following BIFs:</p> <list type="bulleted"> <item> <seealso marker="#suspend_process/2">erlang:suspend_process/2</seealso> </item> <item> <seealso marker="#suspend_process/1">erlang:suspend_process/1</seealso> </item> </list> <p><c><anno>ActiveSuspendCount</anno></c> is the number of times <c><anno>Suspendee</anno></c> has been suspended by <c><anno>Pid</anno></c>. <c><anno>OutstandingSuspendCount</anno></c> is the number of not yet completed suspend requests sent by <c><anno>Pid</anno></c>, that is:</p> <list type="bulleted"> <item>If <c><anno>ActiveSuspendCount</anno> =/= 0</c>, <c><anno>Suspendee</anno></c> is currently in the suspended state. </item> <item>If <c><anno>OutstandingSuspendCount</anno> =/= 0</c>, option <c>asynchronous</c> of <c>erlang:suspend_process/2</c> has been used and the suspendee has not yet been suspended by <c><anno>Pid</anno></c>. </item> </list> <p>Notice that <c><anno>ActiveSuspendCount</anno></c> and <c><anno>OutstandingSuspendCount</anno></c> are not the total suspend count on <c><anno>Suspendee</anno></c>, only the parts contributed by <c><anno>Pid</anno></c>.</p> </item> <tag><c>{total_heap_size, <anno>Size</anno>}</c></tag> <item> <p><c><anno>Size</anno></c> is the total size, in words, of all heap fragments of the process. This includes the process stack.</p> </item> <tag><c>{trace, <anno>InternalTraceFlags</anno>}</c></tag> <item> <p><c><anno>InternalTraceFlags</anno></c> is an integer representing the internal trace flag for this process. This <c><anno>InfoTuple</anno></c> can be changed or removed without prior notice.</p> </item> <tag><c>{trap_exit, <anno>Boolean</anno>}</c></tag> <item> <p><c><anno>Boolean</anno></c> is <c>true</c> if the process is trapping exits, otherwise <c>false</c>.</p> </item> </taglist> <p>Notice that not all implementations support all these <c><anno>Item</anno></c>s.</p> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>If <c><anno>Pid</anno></c> is not a local process.</item> <tag><c>badarg</c></tag> <item>If <c><anno>Item</anno></c> is an invalid item.</item> </taglist> </desc> </func> <func> <name name="processes" arity="0"/> <fsummary>All processes.</fsummary> <desc> <p>Returns a list of process identifiers corresponding to all the processes currently existing on the local node.</p> <p>Notice that an exiting process exists, but is not alive. That is, <c>is_process_alive/1</c> returns <c>false</c> for an exiting process, but its process identifier is part of the result returned from <c>processes/0</c>.</p> <p>Example:</p> <pre> > <input>processes().</input> [<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]</pre> </desc> </func> <func> <name name="purge_module" arity="1"/> <fsummary>Removes old code for a module.</fsummary> <desc> <p>Removes old code for <c><anno>Module</anno></c>. Before this BIF is used, <c>erlang:check_process_code/2</c> is to be called to check that no processes execute old code in the module.</p> <warning> <p>This BIF is intended for the code server (see <seealso marker="kernel:code">code(3)</seealso>) and is not to be used elsewhere.</p> </warning> <p>Failure: <c>badarg</c> if there is no old code for <c><anno>Module</anno></c>.</p> </desc> </func> <func> <name name="put" arity="2"/> <fsummary>Adds a new value to the process dictionary.</fsummary> <desc> <p>Adds a new <c><anno>Key</anno></c> to the process dictionary, associated with the value <c><anno>Val</anno></c>, and returns <c>undefined</c>. If <c><anno>Key</anno></c> exists, the old value is deleted and replaced by <c><anno>Val</anno></c>, and the function returns the old value.</p> <p>Example:</p> <pre> > <input>X = put(name, walrus), Y = put(name, carpenter),</input> <input>Z = get(name),</input> <input>{X, Y, Z}.</input> {undefined,walrus,carpenter}</pre> <note> <p>The values stored when <c>put</c> is evaluated within the scope of a <c>catch</c> are not retracted if a <c>throw</c> is evaluated, or if an error occurs.</p> </note> </desc> </func> <func> <name name="raise" arity="3"/> <fsummary>Stops execution with an exception of given class, reason, and call stack backtrace.</fsummary> <type name="raise_stacktrace"/> <desc> <p>Stops the execution of the calling process with an exception of given class, reason, and call stack backtrace (<em>stacktrace</em>).</p> <warning> <p>This BIF is intended for debugging. Avoid to use it in applications, unless you really know what you are doing.</p> </warning> <p><c><anno>Class</anno></c> is <c>error</c>, <c>exit</c>, or <c>throw</c>. So, if it were not for the stacktrace, <c>erlang:raise(<anno>Class</anno>, <anno>Reason</anno>, <anno>Stacktrace</anno>)</c> is equivalent to <c>erlang:<anno>Class</anno>(<anno>Reason</anno>)</c>.</p> <p><c><anno>Reason</anno></c> is any term. <c><anno>Stacktrace</anno></c> is a list as returned from <c>get_stacktrace()</c>, that is, a list of four-tuples <c>{Module, Function, Arity | Args, Location}</c>, where <c>Module</c> and <c>Function</c> are atoms, and the third element is an integer arity or an argument list. The stacktrace can also contain <c>{Fun, Args, Location}</c> tuples, where <c>Fun</c> is a local fun and <c>Args</c> is an argument list.</p> <p>Element <c>Location</c> at the end is optional. Omitting it is equivalent to specifying an empty list.</p> <p>The stacktrace is used as the exception stacktrace for the calling process; it is truncated to the current maximum stacktrace depth.</p> <p>Since evaluating this function causes the process to terminate, it has no return value unless the arguments are invalid, in which case the function <em>returns the error reason</em> <c>badarg</c>. If you want to be sure not to return, you can call <c>error(erlang:raise(<anno>Class</anno>, <anno>Reason</anno>, <anno>Stacktrace</anno>))</c> and hope to distinguish exceptions later.</p> </desc> </func> <func> <name name="read_timer" arity="2"/> <fsummary>Reads the state of a timer.</fsummary> <desc> <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>Available <c><anno>Option</anno>s</c>:</p> <taglist> <tag><c>{async, Async}</c></tag> <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> is returned by <c>erlang:read_timer()</c>. When <c>Async</c> is <c>true</c>, <c>erlang:read_timer()</c> sends an asynchronous request for the state information to the timer service that manages the timer, and then returns <c>ok</c>. A message on the format <c>{read_timer, <anno>TimerRef</anno>, <anno>Result</anno>}</c> is sent to the caller of <c>erlang:read_timer()</c> when the operation has been processed. </p> </item> </taglist> <p> More <c><anno>Option</anno></c>s may be added in the future. </p> <p> If <c><anno>Result</anno></c> is an integer, it represents the time in milli-seconds left until the timer expires.</p> <p> If <c><anno>Result</anno></c> is <c>false</c>, a timer corresponding to <c><anno>TimerRef</anno></c> could not be found. This can be because the timer had expired, it had been canceled, or because <c><anno>TimerRef</anno></c> never has corresponded to a timer. Even if the timer has expired, it does not tell you whether or not the timeout message has arrived at its destination yet. </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 takes 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 option <c>{async, true}</c>. If using option <c>{async, false}</c>, 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="#cancel_timer/2"><c>erlang:cancel_timer/2</c></seealso>.</p> </desc> </func> <func> <name name="read_timer" arity="1"/> <fsummary>Reads the state of a timer.</fsummary> <desc> <p>Read the state of a timer. The same as calling <seealso marker="#read_timer/2"><c>erlang:read_timer(TimerRef, [])</c></seealso>.</p> </desc> </func> <func> <name name="ref_to_list" arity="1"/> <fsummary>Text representation of a reference.</fsummary> <desc> <p>Returns a string corresponding to the text representation of <c><anno>Ref</anno></c>.</p> <warning> <p>This BIF is intended for debugging and is not to be used in application programs.</p> </warning> </desc> </func> <func> <name name="register" arity="2"/> <fsummary>Registers a name for a pid (or port).</fsummary> <desc> <p>Associates the name <c><anno>RegName</anno></c> with a process identifier (pid) or a port identifier. <c><anno>RegName</anno></c>, which must be an atom, can be used instead of the pid or port identifier in send operator (<c><anno>RegName</anno> ! Message</c>).</p> <p>Example:</p> <pre> > <input>register(db, Pid).</input> true</pre> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>If <c><anno>PidOrPort</anno></c> is not an existing local process or port.</item> <tag><c>badarg</c></tag> <item>If <c><anno>RegName</anno></c> is already in use.</item> <tag><c>badarg</c></tag> <item>If the process or port is already registered (already has a name).</item> <tag><c>badarg</c></tag> <item>If <c><anno>RegName</anno></c> is the atom <c>undefined</c>.</item> </taglist> </desc> </func> <func> <name name="registered" arity="0"/> <fsummary>All registered names.</fsummary> <desc> <p>Returns a list of names that have been registered using <seealso marker="#register/2">register/2</seealso>, for example:</p> <pre> > <input>registered().</input> [code_server, file_server, init, user, my_db]</pre> </desc> </func> <func> <name name="resume_process" arity="1"/> <fsummary>Resumes a suspended process.</fsummary> <desc> <p>Decreases the suspend count on the process identified by <c><anno>Suspendee</anno></c>. <c><anno>Suspendee</anno></c> is previously to have been suspended through <seealso marker="#suspend_process/2">erlang:suspend_process/2</seealso> or <seealso marker="#suspend_process/1">erlang:suspend_process/1</seealso> by the process calling <c>erlang:resume_process(<anno>Suspendee</anno>)</c>. When the suspend count on <c><anno>Suspendee</anno></c> reaches zero, <c><anno>Suspendee</anno></c> is resumed, that is, its state is changed from suspended into the state it had before it was suspended.</p> <warning> <p>This BIF is intended for debugging only.</p> </warning> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Suspendee</anno></c> is not a process identifier. </item> <tag><c>badarg</c></tag> <item> If the process calling <c>erlang:resume_process/1</c> had not previously increased the suspend count on the process identified by <c><anno>Suspendee</anno></c>. </item> <tag><c>badarg</c></tag> <item> If the process identified by <c><anno>Suspendee</anno></c> is not alive. </item> </taglist> </desc> </func> <func> <name name="round" arity="1"/> <fsummary>Returns an integer by rounding a number.</fsummary> <desc> <p>Returns an integer by rounding <c><anno>Number</anno></c>, for example:</p> <pre> <input>round(5.5).</input> 6</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="self" arity="0"/> <fsummary>Returns pid of the calling process.</fsummary> <desc> <p>Returns the process identifier of the calling process, for example:</p> <pre> > <input>self().</input> <0.26.0></pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="send" arity="2"/> <fsummary>Sends a message.</fsummary> <type name="dst"/> <desc> <p>Sends a message and returns <c><anno>Msg</anno></c>. This is the same as <c><anno>Dest</anno> ! <anno>Msg</anno></c>.</p> <p><c><anno>Dest</anno></c> can be a remote or local process identifier, a (local) port, a locally registered name, or a tuple <c>{<anno>RegName</anno>, <anno>Node</anno>}</c> for a registered name at another node.</p> </desc> </func> <func> <name name="send" arity="3"/> <fsummary>Sends a message conditionally.</fsummary> <type name="dst"/> <desc> <p>Either sends a message and returns <c>ok</c>, or does not send the message but returns something else (see the following). Otherwise the same as <seealso marker="#send/2">erlang:send/2</seealso>. For more detailed explanation and warnings, see <seealso marker="#send_nosuspend/2">erlang:send_nosuspend/2,3</seealso>.</p> <p>The options are as follows:</p> <taglist> <tag><c>nosuspend</c></tag> <item> <p>If the sender would have to be suspended to do the send, <c>nosuspend</c> is returned instead.</p> </item> <tag><c>noconnect</c></tag> <item> <p>If the destination node would have to be auto-connected to do the send, <c>noconnect</c> is returned instead.</p> </item> </taglist> <warning> <p>As with <c>erlang:send_nosuspend/2,3</c>: use with extreme care.</p> </warning> </desc> </func> <func> <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> is sent to the process identified by <c><anno>Dest</anno></c>. Apart from the format of the timeout message, <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> <name name="send_after" arity="3"/> <fsummary>Starts a timer.</fsummary> <desc> <p>Starts a timer. The same as calling <seealso marker="#send_after/4"><c>erlang:send_after(<anno>Time</anno>, <anno>Dest</anno>, <anno>Msg</anno>, [])</c></seealso>.</p> </desc> </func> <func> <name name="send_nosuspend" arity="2"/> <fsummary>Tries to send a message without ever blocking.</fsummary> <type name="dst"/> <desc> <p>The same as <seealso marker="#send/3">erlang:send(<anno>Dest</anno>, <anno>Msg</anno>, [nosuspend])</seealso>, but returns <c>true</c> if the message was sent and <c>false</c> if the message was not sent because the sender would have had to be suspended.</p> <p>This function is intended for send operations to an unreliable remote node without ever blocking the sending (Erlang) process. If the connection to the remote node (usually not a real Erlang node, but a node written in C or Java) is overloaded, this function <em>does not send the message</em> and returns <c>false</c>.</p> <p>The same occurs if <c><anno>Dest</anno></c> refers to a local port that is busy. For all other destinations (allowed for the ordinary send operator <c>'!'</c>), this function sends the message and returns <c>true</c>.</p> <p>This function is only to be used in rare circumstances where a process communicates with Erlang nodes that can disappear without any trace, causing the TCP buffers and the drivers queue to be over-full before the node is shut down (because of tick time-outs) by <c>net_kernel</c>. The normal reaction to take when this occurs is some kind of premature shutdown of the other node.</p> <p>Notice that ignoring the return value from this function would result in an <em>unreliable</em> message passing, which is contradictory to the Erlang programming model. The message is <em>not</em> sent if this function returns <c>false</c>.</p> <p>In many systems, transient states of overloaded queues are normal. The fact that this function returns <c>false</c> does not mean that the other node is guaranteed to be non-responsive, it could be a temporary overload. Also, a return value of <c>true</c> does only mean that the message can be sent on the (TCP) channel without blocking, the message is not guaranteed to arrive at the remote node. For a disconnected non-responsive node, the return value is <c>true</c> (mimics the behavior of operator <c>!</c>). The expected behavior and the actions to take when the function returns <c>false</c> are application- and hardware-specific.</p> <warning> <p>Use with extreme care.</p> </warning> </desc> </func> <func> <name name="send_nosuspend" arity="3"/> <fsummary>Tries to send a message without ever blocking.</fsummary> <type name="dst"/> <desc> <p>The same as <seealso marker="#send/3">erlang:send(<anno>Dest</anno>, <anno>Msg</anno>, [nosuspend | <anno>Options</anno>])</seealso>, but with a Boolean return value.</p> <p>This function behaves like <seealso marker="#send_nosuspend/2">erlang:send_nosuspend/2</seealso>, but takes a third parameter, a list of options. The only option is <c>noconnect</c>, which makes the function return <c>false</c> if the remote node is not currently reachable by the local node. The normal behavior is to try to connect to the node, which can stall the process during a short period. The use of option <c>noconnect</c> makes it possible to be sure not to get the slightest delay when sending to a remote process. This is especially useful when communicating with nodes that expect to always be the connecting part (that is, nodes written in C or Java).</p> <p>Whenever the function returns <c>false</c> (either when a suspend would occur or when <c>noconnect</c> was specified and the node was not already connected), the message is guaranteed <em>not</em> to have been sent.</p> <warning> <p>Use with extreme care.</p> </warning> </desc> </func> <func> <name name="set_cookie" arity="2"/> <fsummary>Sets the magic cookie of a node.</fsummary> <desc> <p>Sets the magic cookie of <c><anno>Node</anno></c> to the atom <c><anno>Cookie</anno></c>. If <c><anno>Node</anno></c> is the local node, the function also sets the cookie of all other unknown nodes to <c><anno>Cookie</anno></c> (see Section <seealso marker="doc/reference_manual:distributed">Distributed Erlang</seealso> in the Erlang Reference Manual in System Documentation).</p> <p>Failure: <c>function_clause</c> if the local node is not alive.</p> </desc> </func> <func> <name name="setelement" arity="3"/> <fsummary>Sets the Nth element of a tuple.</fsummary> <type_desc variable="Index">1..tuple_size(<anno>Tuple1</anno></type_desc> <desc> <p>Returns a tuple that is a copy of argument <c><anno>Tuple1</anno></c> with the element given by integer argument <c><anno>Index</anno></c> (the first element is the element with index 1) replaced by argument <c><anno>Value</anno></c>, for example:</p> <pre> > <input>setelement(2, {10, green, bottles}, red).</input> {10,red,bottles}</pre> </desc> </func> <func> <name name="size" arity="1"/> <fsummary>Size of a tuple or binary.</fsummary> <desc> <p>Returns the number of elements in a tuple or the number of bytes in a binary or bitstring, for example:</p> <pre> > <input>size({morni, mulle, bwange}).</input> 3 > <input>size(<<11, 22, 33>>).</input> 3 </pre> <p>For bitstrings the number of whole bytes is returned. That is, if the number of bits in the bitstring is not divisible by 8, the resulting number of bytes is rounded <em>down</em>.</p> <p>Allowed in guard tests.</p> <p>See also <seealso marker="#tuple_size/1"><c>tuple_size/1</c></seealso>, <seealso marker="#byte_size/1"><c>byte_size/1</c></seealso> and <seealso marker="#bit_size/1"><c>bit_size/1</c></seealso>.</p> </desc> </func> <func> <name name="spawn" arity="1"/> <fsummary>Creates a new process with a fun as entry point.</fsummary> <desc> <p>Returns the process identifier of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c>. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn" arity="2"/> <fsummary>Creates a new process with a fun as entry point on a given node.</fsummary> <desc> <p>Returns the process identifier of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c> on <c><anno>Node</anno></c>. If <c><anno>Node</anno></c> does not exist, a useless pid is returned. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn" arity="3"/> <fsummary>Creates a new process with a function as entry point.</fsummary> <desc> <p>Returns the process identifier of a new process started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c>.</p> <p><c>error_handler:undefined_function(<anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> is evaluated by the new process if <c><anno>Module</anno>:<anno>Function</anno>/Arity</c> does not exist (where <c>Arity</c> is the length of <c><anno>Args</anno></c>). The error handler can be redefined (see <seealso marker="#process_flag/2">process_flag/2</seealso>). If <c>error_handler</c> is undefined, or the user has redefined the default <c>error_handler</c> and its replacement is undefined, a failure with reason <c>undef</c> occurs.</p> <p>Example:</p> <pre> > <input>spawn(speed, regulator, [high_speed, thin_cut]).</input> <0.13.1></pre> </desc> </func> <func> <name name="spawn" arity="4"/> <fsummary>Creates a new process with a function as entry point on a given node.</fsummary> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c> on <c><anno>Node</anno></c>. If <c><anno>Node</anno></c> does not exist, a useless pid is returned. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_link" arity="1"/> <fsummary>Creates and links to a new process with a fun as entry point.</fsummary> <desc> <p>Returns the process identifier of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c>. A link is created between the calling process and the new process, atomically. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_link" arity="2"/> <fsummary>Creates and links to a new process with a fun as entry point on a specified node.</fsummary> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c> on <c><anno>Node</anno></c>. A link is created between the calling process and the new process, atomically. If <c><anno>Node</anno></c> does not exist, a useless pid is returned and an exit signal with reason <c>noconnection</c> is sent to the calling process. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_link" arity="3"/> <fsummary>Creates and links to a new process with a function as entry point.</fsummary> <desc> <p>Returns the process identifier of a new process started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c>. A link is created between the calling process and the new process, atomically. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_link" arity="4"/> <fsummary>Creates and links to a new process with a function as entry point on a given node.</fsummary> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c> on <c><anno>Node</anno></c>. A link is created between the calling process and the new process, atomically. If <c><anno>Node</anno></c> does not exist, a useless pid is returned and an exit signal with reason <c>noconnection</c> is sent to the calling process. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_monitor" arity="1"/> <fsummary>Creates and monitors a new process with a fun as entry point.</fsummary> <desc> <p>Returns the process identifier of a new process, started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c>, and a reference for a monitor created to the new process. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_monitor" arity="3"/> <fsummary>Creates and monitors a new process with a function as entry point.</fsummary> <desc> <p>A new process is started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c>. The process is monitored at the same time. Returns the process identifier and a reference for the monitor. Otherwise works like <seealso marker="#spawn/3">spawn/3</seealso>.</p> </desc> </func> <func> <name name="spawn_opt" arity="2"/> <fsummary>Creates a new process with a fun as entry point.</fsummary> <type name="priority_level"/> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c>. Otherwise works like <seealso marker="#spawn_opt/4">spawn_opt/4</seealso>.</p> <p>If option <c>monitor</c> is given, the newly created process is monitored, and both the pid and reference for the monitor is returned.</p> </desc> </func> <func> <name name="spawn_opt" arity="3"/> <fsummary>Creates a new process with a fun as entry point on a given node.</fsummary> <type name="priority_level"/> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Fun</anno></c> to the empty list <c>[]</c> on <c><anno>Node</anno></c>. If <c><anno>Node</anno></c> does not exist, a useless pid is returned. Otherwise works like <seealso marker="#spawn_opt/4">spawn_opt/4</seealso>.</p> </desc> </func> <func> <name name="spawn_opt" arity="4"/> <fsummary>Creates a new process with a function as entry point.</fsummary> <type name="priority_level"/> <desc> <p>Works as <seealso marker="#spawn/3">spawn/3</seealso>, except that an extra option list is given when creating the process.</p> <p>If option <c>monitor</c> is given, the newly created process is monitored, and both the pid and reference for the monitor is returned.</p> <p>The options are as follows:</p> <taglist> <tag><c>link</c></tag> <item> <p>Sets a link to the parent process (like <c>spawn_link/3</c> does).</p> </item> <tag><c>monitor</c></tag> <item> <p>Monitors the new process (like <seealso marker="#monitor/2">monitor/2</seealso> does).</p> </item> <tag><c>{priority, <anno>Level</anno></c></tag> <item> <p>Sets the priority of the new process. Equivalent to executing <seealso marker="#process_flag_priority">process_flag(priority, <anno>Level</anno>)</seealso> in the start function of the new process, except that the priority is set before the process is selected for execution for the first time. For more information on priorities, see <seealso marker="#process_flag_priority">process_flag(priority, <anno>Level</anno>)</seealso>.</p> </item> <tag><c>{fullsweep_after, <anno>Number</anno>}</c></tag> <item> <p>Useful only for performance tuning. Do not use this option unless you know that there is problem with execution times or memory consumption, and ensure that the option improves matters.</p> <p>The Erlang runtime system uses a generational garbage collection scheme, using an "old heap" for data that has survived at least one garbage collection. When there is no more room on the old heap, a fullsweep garbage collection is done.</p> <p>Option <c>fullsweep_after</c> makes it possible to specify the maximum number of generational collections before forcing a fullsweep, even if there is room on the old heap. Setting the number to zero disables the general collection algorithm, that is, all live data is copied at every garbage collection.</p> <p>A few cases when it can be useful to change <c>fullsweep_after</c>:</p> <list type="bulleted"> <item>If binaries that are no longer used are to be thrown away as soon as possible. (Set <c><anno>Number</anno></c> to zero.) </item> <item>A process that mostly have short-lived data is fullsweeped seldom or never, that is, the old heap contains mostly garbage. To ensure a fullsweep occasionally, set <c><anno>Number</anno></c> to a suitable value, such as 10 or 20. </item> <item>In embedded systems with a limited amount of RAM and no virtual memory, you might want to preserve memory by setting <c><anno>Number</anno></c> to zero. (The value can be set globally, see <seealso marker="#system_flag/2">erlang:system_flag/2</seealso>.) </item> </list> </item> <tag><c>{min_heap_size, <anno>Size</anno>}</c></tag> <item> <p>Useful only for performance tuning. Do not use this option unless you know that there is problem with execution times or memory consumption, and ensure that the option improves matters.</p> <p>Gives a minimum heap size, in words. Setting this value higher than the system default can speed up some processes because less garbage collection is done. However, setting a too high value can waste memory and slow down the system because of worse data locality. Therefore, use this option only for fine-tuning an application and to measure the execution time with various <c><anno>Size</anno></c> values.</p> </item> <tag><c>{min_bin_vheap_size, <anno>VSize</anno>}</c></tag> <item> <p>Useful only for performance tuning. Do not use this option unless you know that there is problem with execution times or memory consumption, and ensure that the option improves matters.</p> <p>Gives a minimum binary virtual heap size, in words. Setting this value higher than the system default can speed up some processes because less garbage collection is done. However, setting a too high value can waste memory. Therefore, use this option only for fine-tuning an application and to measure the execution time with various <c><anno>VSize</anno></c> values.</p> </item> </taglist> </desc> </func> <func> <name name="spawn_opt" arity="5"/> <fsummary>Creates a new process with a function as entry point on a given node.</fsummary> <type name="priority_level"/> <desc> <p>Returns the process identifier (pid) of a new process started by the application of <c><anno>Module</anno>:<anno>Function</anno></c> to <c><anno>Args</anno></c> on <c><anno>Node</anno></c>. If <c><anno>Node</anno></c> does not exist, a useless pid is returned. Otherwise works like <seealso marker="#spawn_opt/4">spawn_opt/4</seealso>.</p> <note><p>Option <c>monitor</c> is not supported by <c>spawn_opt/5</c>.</p></note> </desc> </func> <func> <name name="split_binary" arity="2"/> <fsummary>Splits a binary into two.</fsummary> <type_desc variable="Pos">0..byte_size(Bin)</type_desc> <desc> <p>Returns a tuple containing the binaries that are the result of splitting <c><anno>Bin</anno></c> into two parts at position <c><anno>Pos</anno></c>. This is not a destructive operation. After the operation, there are three binaries altogether.</p> <p>Example:</p> <pre> > <input>B = list_to_binary("0123456789").</input> <<"0123456789">> > <input>byte_size(B).</input> 10 > <input>{B1, B2} = split_binary(B,3).</input> {<<"012">>,<<"3456789">>} > <input>byte_size(B1).</input> 3 > <input>byte_size(B2).</input> 7</pre> </desc> </func> <func> <name name="start_timer" arity="4"/> <fsummary>Starts a timer.</fsummary> <desc> <p> Starts a timer. When the timer expires, the message <c>{timeout, <anno>TimerRef</anno>, <anno>Msg</anno>}</c> is sent to the process identified by <c><anno>Dest</anno></c>. </p> <p>Available <c><anno>Option</anno></c>s:</p> <taglist> <tag><c>{abs, false}</c></tag> <item> <p> This is the default. It means the <c><anno>Time</anno></c> value is interpreted as a time in milli-seconds <em>relative</em> current <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso>. </p> </item> <tag><c>{abs, true}</c></tag> <item> <p> Absolute <c><anno>Time</anno></c> value. The <c><anno>Time</anno></c> value is interpreted as an absolute Erlang monotonic time in milli-seconds. </p> </item> </taglist> <p> More <c><anno>Option</anno></c>s may be added in the future. </p> <p> The absolute point in time, 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 must 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 is 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 is automatically canceled if the process referred to by the <c>pid()</c> is not alive, or if the process exits. This feature was introduced in ERTS version 5.4.11. Notice that timers are not 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>, and <seealso marker="#read_timer/2"><c>erlang:read_timer/2</c></seealso>.</p> <p>Failure: <c>badarg</c> if the arguments do not satisfy the requirements specified here.</p> </desc> </func> <func> <name name="start_timer" arity="3"/> <fsummary>Starts a timer.</fsummary> <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>, [])</c></seealso>.</p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="1"/> <fsummary>Information about active processes and ports.</fsummary> <desc><marker id="statistics_active_tasks"></marker> <p> Returns a list where each element represents the amount of active processes and ports on each run queue and its associated scheduler. That is, the number of processes and ports that are ready to run, or are currently running. The element location in the list corresponds to the scheduler and its run queue. The first element corresponds to scheduler number 1 and so on. The information is <em>not</em> gathered atomically. That is, the result is not necessarily a consistent snapshot of the state, but instead quite efficiently gathered. See also, <seealso marker="#statistics_total_active_tasks"><c>statistics(total_active_tasks)</c></seealso>, <seealso marker="#statistics_run_queue_lengths"><c>statistics(run_queue_lengths)</c></seealso>, and <seealso marker="#statistics_total_run_queue_lengths"><c>statistics(total_run_queue_lengths)</c></seealso>. </p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="2"/> <fsummary>Information about context switches.</fsummary> <desc> <p>Returns the total number of context switches since the system started.</p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="3"/> <fsummary>Information about exact reductions.</fsummary> <desc> <marker id="statistics_exact_reductions"></marker> <p>Returns the number of exact reductions.</p> <note><p><c>statistics(exact_reductions)</c> is a more expensive operation than <seealso marker="#statistics_reductions">statistics(reductions)</seealso>, especially on an Erlang machine with SMP support.</p> </note> </desc> </func> <func> <name name="statistics" arity="1" clause_i="4"/> <fsummary>Information about garbage collection.</fsummary> <desc> <p>Returns information about garbage collection, for example:</p> <pre> > <input>statistics(garbage_collection).</input> {85,23961,0}</pre> <p>This information can be invalid for some implementations.</p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="5"/> <fsummary>Information about I/O.</fsummary> <desc> <p>Returns <c><anno>Input</anno></c>, which is the total number of bytes received through ports, and <c><anno>Output</anno></c>, which is the total number of bytes output to ports.</p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="6"/> <fsummary>Information about reductions.</fsummary> <desc> <marker id="statistics_reductions"></marker> <p>Returns information about reductions, for example:</p> <pre> > <input>statistics(reductions).</input> {2046,11}</pre> <note><p>As from <c>ERTS</c> 5.5 (OTP R11B), this value does not include reductions performed in current time slices of currently scheduled processes. If an exact value is wanted, use <seealso marker="#statistics_exact_reductions">statistics(exact_reductions)</seealso>.</p> </note> </desc> </func> <func> <name name="statistics" arity="1" clause_i="7"/> <fsummary>Information about the run-queues.</fsummary> <desc><marker id="statistics_run_queue"></marker> <p> Returns the total length of the run-queues. That is, the number of processes and ports that are ready to run on all available run-queues. The information is gathered atomically. That is, the result is a consistent snapshot of the state, but this operation is much more expensive compared to <seealso marker="#statistics_total_run_queue_lengths"><c>statistics(total_run_queue_lengths)</c></seealso>. This especially when a large amount of schedulers is used. </p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="8"/> <fsummary>Information about the run-queue lengths.</fsummary> <desc><marker id="statistics_run_queue_lengths"></marker> <p> Returns a list where each element represents the amount of processes and ports ready to run for each run queue. The element location in the list corresponds to the run queue of a scheduler. The first element corresponds to the run queue of scheduler number 1 and so on. The information is <em>not</em> gathered atomically. That is, the result is not necessarily a consistent snapshot of the state, but instead quite efficiently gathered. See also, <seealso marker="#statistics_total_run_queue_lengths"><c>statistics(total_run_queue_lengths)</c></seealso>, <seealso marker="#statistics_active_tasks"><c>statistics(active_tasks)</c></seealso>, and <seealso marker="#statistics_total_active_tasks"><c>statistics(total_active_tasks)</c></seealso>. </p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="9"/> <fsummary>Information about runtime.</fsummary> <desc> <p>Returns information about runtime, in milliseconds.</p> <p>This is the sum of the runtime for all threads in the Erlang runtime system and can therefore be greater than the wall clock time.</p> <p>Example:</p> <pre> > <input>statistics(runtime).</input> {1690,1620}</pre> </desc> </func> <func> <name name="statistics" arity="1" clause_i="10"/> <fsummary>Information about each schedulers work time.</fsummary> <desc> <marker id="statistics_scheduler_wall_time"></marker> <p>Returns a list of tuples with <c>{<anno>SchedulerId</anno>, <anno>ActiveTime</anno>, <anno>TotalTime</anno>}</c>, where <c><anno>SchedulerId</anno></c> is an integer ID of the scheduler, <c><anno>ActiveTime</anno></c> is the duration the scheduler has been busy, and <c><anno>TotalTime</anno></c> is the total time duration since <seealso marker="#system_flag_scheduler_wall_time">scheduler_wall_time</seealso> activation. The time unit is undefined and can be subject to change between releases, OSs, and system restarts. <c>scheduler_wall_time</c> is only to be used to calculate relative values for scheduler-utilization. <c><anno>ActiveTime</anno></c> can never exceed <c><anno>TotalTime</anno></c>.</p> <p>The definition of a busy scheduler is when it is not idle and is not scheduling (selecting) a process or port, that is:</p> <list type="bulleted"> <item>Executing process code</item> <item>Executing linked-in-driver or NIF code</item> <item>Executing built-in-functions, or any other runtime handling</item> <item>Garbage collecting</item> <item>Handling any other memory management</item> </list> <p>Notice that a scheduler can also be busy even if the OS has scheduled out the scheduler thread.</p> <p>Returns <c>undefined</c> if system flag <seealso marker="#system_flag_scheduler_wall_time">scheduler_wall_time</seealso> is turned off.</p> <p>The list of scheduler information is unsorted and can appear in different order between calls.</p> <p>Using <c>scheduler_wall_time</c> to calculate scheduler-utilization:</p> <pre> > <input>erlang:system_flag(scheduler_wall_time, true).</input> false > <input>Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.</input> ok</pre> <p>Some time later the user takes another snapshot and calculates scheduler-utilization per scheduler, for example:</p> <pre> > <input>Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok.</input> ok > <input>lists:map(fun({{I, A0, T0}, {I, A1, T1}}) -> {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)).</input> [{1,0.9743474730177548}, {2,0.9744843782751444}, {3,0.9995902361669045}, {4,0.9738012596572161}, {5,0.9717956667018103}, {6,0.9739235846420741}, {7,0.973237033077876}, {8,0.9741297293248656}]</pre> <p>Using the same snapshots to calculate a total scheduler-utilization:</p> <pre> > <input>{A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) -> {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)), A/T.</input> 0.9769136803764825</pre> <note> <p><c>scheduler_wall_time</c> is by default disabled. To enable it, use <c>erlang:system_flag(scheduler_wall_time, true)</c>.</p> </note> </desc> </func> <func> <name name="statistics" arity="1" clause_i="11"/> <fsummary>Information about active processes and ports.</fsummary> <desc><marker id="statistics_total_active_tasks"></marker> <p> Returns the total amount of active processes and ports in the system. That is, the number of processes and ports that are ready to run, or are currently running. The information is <em>not</em> gathered atomically. That is, the result is not necessarily a consistent snapshot of the state, but instead quite efficiently gathered. See also, <seealso marker="#statistics_active_tasks"><c>statistics(active_tasks)</c></seealso>, <seealso marker="#statistics_run_queue_lengths"><c>statistics(run_queue_lengths)</c></seealso>, and <seealso marker="#statistics_total_run_queue_lengths"><c>statistics(total_run_queue_lengths)</c></seealso>. </p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="12"/> <fsummary>Information about the run-queue lengths.</fsummary> <desc><marker id="statistics_total_run_queue_lengths"></marker> <p> Returns the total length of the run-queues. That is, the number of processes and ports that are ready to run on all available run-queues. The information is <em>not</em> gathered atomically. That is, the result is not necessarily a consistent snapshot of the state, but much more efficiently gathered compared to <seealso marker="#statistics_run_queue"><c>statistics(run_queue)</c></seealso>. See also, <seealso marker="#statistics_run_queue_lengths"><c>statistics(run_queue_lengths)</c></seealso>, <seealso marker="#statistics_total_active_tasks"><c>statistics(total_active_tasks)</c></seealso>, and <seealso marker="#statistics_active_tasks"><c>statistics(active_tasks)</c></seealso>. </p> </desc> </func> <func> <name name="statistics" arity="1" clause_i="13"/> <fsummary>Information about wall clock.</fsummary> <desc> <p>Returns information about wall clock. <c>wall_clock</c> can be used in the same manner as <c>runtime</c>, except that real time is measured as opposed to runtime or CPU time.</p> </desc> </func> <func> <name name="suspend_process" arity="2"/> <fsummary>Suspends a process.</fsummary> <desc> <p>Increases the suspend count on the process identified by <c><anno>Suspendee</anno></c> and puts it in the suspended state if it is not already in that state. A suspended process will not be scheduled for execution until the process has been resumed.</p> <p>A process can be suspended by multiple processes and can be suspended multiple times by a single process. A suspended process does not leave the suspended state until its suspend count reaches zero. The suspend count of <c><anno>Suspendee</anno></c> is decreased when <seealso marker="#resume_process/1">erlang:resume_process(<anno>Suspendee</anno>)</seealso> is called by the same process that called <c>erlang:suspend_process(<anno>Suspendee</anno>)</c>. All increased suspend counts on other processes acquired by a process are automatically decreased when the process terminates.</p> <p>The options (<c><anno>Opt</anno></c>s) are as follows:</p> <taglist> <tag><c>asynchronous</c></tag> <item> A suspend request is sent to the process identified by <c><anno>Suspendee</anno></c>. <c><anno>Suspendee</anno></c> eventually suspends unless it is resumed before it could suspend. The caller of <c>erlang:suspend_process/2</c> returns immediately, regardless of whether <c><anno>Suspendee</anno></c> has suspended yet or not. The point in time when <c><anno>Suspendee</anno></c> suspends cannot be deduced from other events in the system. It is only guaranteed that <c><anno>Suspendee</anno></c> <em>eventually</em> suspends (unless it is resumed). If option <c>asynchronous</c> has <em>not</em> been passed, the caller of <c>erlang:suspend_process/2</c> is blocked until <c><anno>Suspendee</anno></c> has suspended. </item> <tag><c>unless_suspending</c></tag> <item> The process identified by <c><anno>Suspendee</anno></c> is suspended unless the calling process already is suspending <c><anno>Suspendee</anno></c>. If <c>unless_suspending</c> is combined with option <c>asynchronous</c>, a suspend request is sent unless the calling process already is suspending <c><anno>Suspendee</anno></c> or if a suspend request already has been sent and is in transit. If the calling process already is suspending <c><anno>Suspendee</anno></c>, or if combined with option <c>asynchronous</c> and a send request already is in transit, <c>false</c> is returned and the suspend count on <c><anno>Suspendee</anno></c> remains unchanged. </item> </taglist> <p>If the suspend count on the process identified by <c><anno>Suspendee</anno></c> is increased, <c>true</c> is returned, otherwise <c>false</c>.</p> <warning> <p>This BIF is intended for debugging only.</p> </warning> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item> If <c><anno>Suspendee</anno></c> is not a process identifier. </item> <tag><c>badarg</c></tag> <item> If the process identified by <c><anno>Suspendee</anno></c> is the same process as the process calling <c>erlang:suspend_process/2</c>. </item> <tag><c>badarg</c></tag> <item> If the process identified by <c><anno>Suspendee</anno></c> is not alive. </item> <tag><c>badarg</c></tag> <item> If the process identified by <c><anno>Suspendee</anno></c> resides on another node. </item> <tag><c>badarg</c></tag> <item> If <c><anno>OptList</anno></c> is not a proper list of valid <c><anno>Opt</anno></c>s. </item> <tag><c>system_limit</c></tag> <item> If the process identified by <c><anno>Suspendee</anno></c> has been suspended more times by the calling process than can be represented by the currently used internal data structures. The system limit is higher than 2,000,000,000 suspends and will never be lower. </item> </taglist> </desc> </func> <func> <name name="suspend_process" arity="1"/> <fsummary>Suspends a process.</fsummary> <desc> <p>Suspends the process identified by <c><anno>Suspendee</anno></c>. The same as calling <seealso marker="#suspend_process/2">erlang:suspend_process(<anno>Suspendee</anno>, [])</seealso>.</p> <warning> <p>This BIF is intended for debugging only.</p> </warning> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="1"/> <fsummary>Sets system flag <c>backtrace_depth</c>.</fsummary> <desc> <p>Sets the maximum depth of call stack back-traces in the exit reason element of <c>'EXIT'</c> tuples.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="2"/> <fsummary>Sets system flag <c>cpu_topology</c>.</fsummary> <type name="cpu_topology"/> <type name="level_entry"/> <type name="level_tag"/> <type name="sub_level"/> <type name="info_list"/> <desc> <warning> <p><marker id="system_flag_cpu_topology"></marker> This argument is <em>deprecated</em> and scheduled for removal in <c>ERTS</c> 5.10/OTP R16. Instead of using this argument, use command-line argument <seealso marker="erts:erl#+sct">+sct</seealso> in <c>erl(1)</c>.</p> <p>When this argument is removed, a final CPU topology to use is determined at emulator boot time.</p> </warning> <p>Sets the user-defined <c><anno>CpuTopology</anno></c>. The user-defined CPU topology overrides any automatically detected CPU topology. By passing <c>undefined</c> as <c><anno>CpuTopology</anno></c>, the system reverts to the CPU topology automatically detected. The returned value equals the value returned from <c>erlang:system_info(cpu_topology)</c> before the change was made.</p> <p>Returns the old value of the flag.</p> <p>The CPU topology is used when binding schedulers to logical processors. If schedulers are already bound when the CPU topology is changed, the schedulers are sent a request to rebind according to the new CPU topology.</p> <p>The user-defined CPU topology can also be set by passing command-line argument <seealso marker="erts:erl#+sct">+sct</seealso> to <c>erl(1)</c>.</p> <p>For information on type <c><anno>CpuTopology</anno></c> and more, see <seealso marker="#system_info_cpu_topology">erlang:system_info(cpu_topology)</seealso> as well as the command-line flags <seealso marker="erts:erl#+sct">+sct</seealso> and <seealso marker="erts:erl#+sbt">+sbt</seealso> in <c>erl(1)</c>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="3"/> <fsummary>Sets <c>system_flag_dirty_cpu_schedulers_online</c>.</fsummary> <desc> <p><marker id="system_flag_dirty_cpu_schedulers_online"></marker> Sets the number of dirty CPU schedulers online. Range is <![CDATA[1 <= DirtyCPUSchedulersOnline <= N]]>, where <c>N</c> is the smallest of the return values of <c>erlang:system_info(dirty_cpu_schedulers)</c> and <c>erlang:system_info(schedulers_online)</c>.</p> <p>Returns the old value of the flag.</p> <p>The number of dirty CPU schedulers online can change if the number of schedulers online changes. For example, if 12 schedulers and 6 dirty CPU schedulers are online, and <c>system_flag/2</c> is used to set the number of schedulers online to 6, then the number of dirty CPU schedulers online is automatically decreased by half as well, down to 3. Similarly, the number of dirty CPU schedulers online increases proportionally to increases in the number of schedulers online.</p> <note><p>The dirty schedulers functionality is experimental. Enable support for dirty schedulers when building OTP to try out the functionality.</p> </note> <p>For more information, see <seealso marker="#system_info_dirty_cpu_schedulers">erlang:system_info(dirty_cpu_schedulers)</seealso> and <seealso marker="#system_info_dirty_cpu_schedulers_online">erlang:system_info(dirty_cpu_schedulers_online)</seealso>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="4"/> <fsummary>Sets system flag <c>fullsweep_after</c>.</fsummary> <desc> <p>Sets system flag <c>fullsweep_after</c>. <c><anno>Number</anno></c> is a non-negative integer indicating how many times generational garbage collections can be done without forcing a fullsweep collection. The value applies to new processes, while processes already running are not affected.</p> <p>Returns the old value of the flag.</p> <p>In low-memory systems (especially without virtual memory), setting the value to <c>0</c> can help to conserve memory.</p> <p>This value can also be set through (OS) environment variable <c>ERL_FULLSWEEP_AFTER</c>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="5"/> <fsummary>Sets system flag <c>min_heap_size</c>.</fsummary> <desc> <p>Sets the default minimum heap size for processes. The size is given in words. The new <c>min_heap_size</c> effects only processes spawned after the change of <c>min_heap_size</c> has been made. <c>min_heap_size</c> can be set for individual processes by using <seealso marker="#spawn_opt/4">spawn_opt/N</seealso> or <seealso marker="#process_flag/2">process_flag/2</seealso>.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="6"/> <fsummary>Sets system flag <c>min_bin_vheap_size</c>.</fsummary> <desc> <p>Sets the default minimum binary virtual heap size for processes. The size is given in words. The new <c>min_bin_vhheap_size</c> effects only processes spawned after the change of <c>min_bin_vhheap_size</c> has been made. <c>min_bin_vheap_size</c> can be set for individual processes by using <seealso marker="#spawn_opt/4">spawn_opt/N</seealso> or <seealso marker="#process_flag/2">process_flag/2</seealso>.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="7"/> <fsummary>Sets system flag <c>multi_scheduling</c>.</fsummary> <desc> <p><marker id="system_flag_multi_scheduling"></marker> If multi-scheduling is enabled, more than one scheduler thread is used by the emulator. Multi-scheduling can be blocked. When multi-scheduling is blocked, only one scheduler thread schedules Erlang processes.</p> <p>If <c><anno>BlockState</anno> =:= block</c>, multi-scheduling is blocked. If <c><anno>BlockState</anno> =:= unblock</c> and no one else blocks multi-scheduling, and this process has blocked only once, multi-scheduling is unblocked.</p> <p>One process can block multi-scheduling multiple times. If a process has blocked multiple times, it must unblock exactly as many times as it has blocked before it has released its multi-scheduling block. If a process that has blocked multi-scheduling exits, it releases its blocking of multi-scheduling.</p> <p>The return values are <c>disabled</c>, <c>blocked</c>, or <c>enabled</c>. The returned value describes the state just after the call to <c>erlang:system_flag(multi_scheduling, <anno>BlockState</anno>)</c> has been made. For information about the return values, see <seealso marker="#system_info_multi_scheduling">erlang:system_info(multi_scheduling)</seealso>.</p> <note><p>Blocking of multi-scheduling is normally not needed. If you feel that you need to block multi-scheduling, consider it a few more times again. Blocking multi-scheduling is only to be used as a last resort, as it is most likely a <em>very inefficient</em> way to solve the problem.</p> </note> <p>See also <seealso marker="#system_info_multi_scheduling">erlang:system_info(multi_scheduling)</seealso>, <seealso marker="#system_info_multi_scheduling_blockers">erlang:system_info(multi_scheduling_blockers)</seealso>, and <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="8"/> <fsummary>Sets system flag <c>scheduler_bind_type</c>.</fsummary> <type name="scheduler_bind_type"/> <desc> <warning> <p><marker id="system_flag_scheduler_bind_type"></marker> This argument is <em>deprecated</em> and scheduled for removal in <c>ERTS</c> 5.10/OTP R16. Instead of using this argument, use command-line argument <seealso marker="erts:erl#+sbt">+sbt</seealso> in <c>erl(1)</c>. When this argument is removed, a final scheduler bind type to use is determined at emulator boot time.</p> </warning> <p>Controls if and how schedulers are bound to logical processors.</p> <p>When <c>erlang:system_flag(scheduler_bind_type, <anno>How</anno>)</c> is called, an asynchronous signal is sent to all schedulers online, causing them to try to bind or unbind as requested.</p> <note><p>If a scheduler fails to bind, this is often silently ignored, as it is not always possible to verify valid logical processor identifiers. If an error is reported, it is reported to <c>error_logger</c>. To verify that the schedulers have bound as requested, call <seealso marker="#system_info_scheduler_bindings">erlang:system_info(scheduler_bindings)</seealso>.</p> </note> <p>Schedulers can be bound on newer Linux, Solaris, FreeBSD, and Windows systems, but more systems will be supported in future releases.</p> <p>In order for the runtime system to be able to bind schedulers, the CPU topology must be known. If the runtime system fails to detect the CPU topology automatically, it can be defined. For more information on how to define the CPU topology, see command-line flag <seealso marker="erts:erl#+sct">+sct</seealso> in <c>erl(1)</c>.</p> <p>The runtime system does by default <em>not</em> bind schedulers to logical processors.</p> <note><p>If the Erlang runtime system is the only OS process binding threads to logical processors, this improves the performance of the runtime system. However, if other OS processes (for example, another Erlang runtime system) also bind threads to logical processors, there can be a performance penalty instead. Sometimes this performance penalty can be severe. If so, it is recommended to not bind the schedulers.</p> </note> <p>Schedulers can be bound in different ways. Argument <c><anno>How</anno></c> determines how schedulers are bound and can be any of the following:</p> <taglist> <tag><c>unbound</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt u</seealso> in <c>erl(1)</c>. </p></item> <tag><c>no_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt ns</seealso> in <c>erl(1)</c>. </p></item> <tag><c>thread_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt ts</seealso> in <c>erl(1)</c>. </p></item> <tag><c>processor_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt ps</seealso> in <c>erl(1)</c>. </p></item> <tag><c>spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt s</seealso> in <c>erl(1)</c>. </p></item> <tag><c>no_node_thread_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt nnts</seealso> in <c>erl(1)</c>. </p></item> <tag><c>no_node_processor_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt nnps</seealso> in <c>erl(1)</c>. </p></item> <tag><c>thread_no_node_processor_spread</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt tnnps</seealso> in <c>erl(1)</c>. </p></item> <tag><c>default_bind</c></tag> <item><p>Same as command-line argument <seealso marker="erts:erl#+sbt">+sbt db</seealso> in <c>erl(1)</c>. </p></item> </taglist> <p>The returned value equals <c><anno>How</anno></c> before flag <c>scheduler_bind_type</c> was changed.</p> <p>Failures:</p> <taglist> <tag><c>notsup</c></tag> <item> <p>If binding of schedulers is not supported.</p> </item> <tag><c>badarg</c></tag> <item> <p>If <c><anno>How</anno></c> is not one of the documented alternatives.</p> </item> <tag><c>badarg</c></tag> <item> <p>If CPU topology information is unavailable.</p> </item> </taglist> <p>The scheduler bind type can also be set by passing command-line argument <seealso marker="erts:erl#+sbt">+sbt</seealso> to <c>erl(1)</c>.</p> <p>For more information, see <seealso marker="#system_info_scheduler_bind_type">erlang:system_info(scheduler_bind_type)</seealso>, <seealso marker="#system_info_scheduler_bindings">erlang:system_info(scheduler_bindings)</seealso>, as well as command-line flags <seealso marker="erts:erl#+sbt">+sbt</seealso> and <seealso marker="erts:erl#+sct">+sct</seealso> in <c>erl(1)</c>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="9"/> <fsummary>Sets system flag <c>scheduler_wall_time</c>.</fsummary> <desc><p><marker id="system_flag_scheduler_wall_time"></marker> Turns on or off scheduler wall time measurements.</p> <p>For more information, see <seealso marker="#statistics_scheduler_wall_time">erlang:statistics(scheduler_wall_time)</seealso>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="10"/> <fsummary>Sets system flag <c>schedulers_online</c>.</fsummary> <desc> <p><marker id="system_flag_schedulers_online"></marker> Sets the number of schedulers online. Range is <![CDATA[1 <= SchedulersOnline <= erlang:system_info(schedulers)]]>.</p> <p>Returns the old value of the flag.</p> <p>If the emulator was built with support for <seealso marker="#system_flag_dirty_cpu_schedulers_online">dirty schedulers</seealso>, changing the number of schedulers online can also change the number of dirty CPU schedulers online. For example, if 12 schedulers and 6 dirty CPU schedulers are online, and <c>system_flag/2</c> is used to set the number of schedulers online to 6, then the number of dirty CPU schedulers online is automatically decreased by half as well, down to 3. Similarly, the number of dirty CPU schedulers online increases proportionally to increases in the number of schedulers online.</p> <p>For more information, see <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso> and <seealso marker="#system_info_schedulers_online">erlang:system_info(schedulers_online)</seealso>.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="11"/> <fsummary>Sets system flag <c>trace_control_word</c>.</fsummary> <desc> <p>Sets the value of the node trace control word to <c><anno>TCW</anno></c>, which is to be an unsigned integer. For more information, see the function <seealso marker="erts:match_spec#set_tcw">set_tcw</seealso> in Section "Match Specifications in Erlang" in the User's Guide.</p> <p>Returns the old value of the flag.</p> </desc> </func> <func> <name name="system_flag" arity="2" clause_i="12"/> <fsummary>Finalize the Time Offset</fsummary> <desc> <p><marker id="system_flag_time_offset"></marker> Finalizes the <seealso marker="#time_offset/0">time offset</seealso> when <seealso marker="time_correction#Single_Time_Warp_Mode">single time warp mode</seealso> is used. If another time warp mode is used, the time offset state is left unchanged.</p> <p>Returns the old state identifier. That is:</p> <list> <item><p>If <c>preliminary</c> is returned, finalization was performed and the time offset is now final.</p></item> <item><p>If <c>final</c> is returned, the time offset was already in the final state. This either because another <c>erlang:system_flag(time_offset, finalize)</c> call, or because <seealso marker="time_correction#No_Time_Warp_Mode">no time warp mode</seealso> is used.</p></item> <item><p>If <c>volatile</c> is returned, the time offset cannot be finalized because <seealso marker="time_correction#Multi_Time_Warp_Mode">multi time warp mode</seealso> is used.</p></item> </list> </desc> </func> <func> <name name="system_info" arity="1" clause_i="1"/> <name name="system_info" arity="1" clause_i="2"/> <name name="system_info" arity="1" clause_i="3"/> <name name="system_info" arity="1" clause_i="4"/> <name name="system_info" arity="1" clause_i="5"/> <fsummary>Information about the system allocators.</fsummary> <type variable="Allocator" name_i="2"/> <type variable="Version" name_i="2"/> <type variable="Features" name_i="2"/> <type variable="Settings" name_i="2"/> <type variable="Alloc" name_i="3"/> <desc> <marker id="system_info_allocator_tags"></marker> <p>Returns various information about the allocators of the current system (emulator) as specified by <c><anno>Item</anno></c>:</p> <marker id="system_info_allocated_areas"></marker> <taglist> <tag><c>allocated_areas</c></tag> <item> <p>Returns a list of tuples with information about miscellaneous allocated memory areas.</p> <p>Each tuple contains an atom describing the type of memory as first element and the amount of allocated memory in bytes as second element. When information about allocated and used memory is present, also a third element is present, containing the amount of used memory in bytes.</p> <p><c>erlang:system_info(allocated_areas)</c> is intended for debugging, and the content is highly implementation-dependent. The content of the results therefore changes when needed without prior notice.</p> <p>Notice that the sum of these values is <em>not</em> the total amount of memory allocated by the emulator. Some values are part of other values, and some memory areas are not part of the result. For information about the total amount of memory allocated by the emulator, see <seealso marker="#memory/0">erlang:memory/0,1</seealso>.</p> </item> <tag><c>allocator</c></tag> <item> <marker id="system_info_allocator"></marker> <p>Returns <c>{<anno>Allocator</anno>, <anno>Version</anno>, <anno>Features</anno>, <anno>Settings</anno></c>, where:</p> <list type="bulleted"> <item> <p><c><anno>Allocator</anno></c> corresponds to the <c>malloc()</c> implementation used. If <c><anno>Allocator</anno></c> equals <c>undefined</c>, the <c>malloc()</c> implementation used cannot be identified. <c>glibc</c> can be identified.</p> </item> <item> <p><c><anno>Version</anno></c> is a list of integers (but not a string) representing the version of the <c>malloc()</c> implementation used.</p> </item> <item> <p><c><anno>Features</anno></c> is a list of atoms representing the allocation features used.</p> </item> <item> <p><c><anno>Settings</anno></c> is a list of subsystems, their configurable parameters, and used values. Settings can differ between different combinations of platforms, allocators, and allocation features. Memory sizes are given in bytes.</p> </item> </list> <p>See also "System Flags Effecting erts_alloc" in <seealso marker="erts:erts_alloc#flags">erts_alloc(3)</seealso>.</p> </item> <tag><c>alloc_util_allocators</c></tag> <item> <marker id="system_info_alloc_util_allocators"></marker> <p>Returns a list of the names of all allocators using the <c>ERTS</c> internal <c>alloc_util</c> framework as atoms. For more information, see Section <seealso marker="erts:erts_alloc#alloc_util">"The alloc_util framework" in erts_alloc(3)</seealso>.</p> </item> <tag><c>{allocator, <anno>Alloc</anno>}</c></tag> <item> <marker id="system_info_allocator_tuple"></marker> <p>Returns information about the specified allocator. As from <c>ERTS</c> 5.6.1, the return value is a list of <c>{instance, InstanceNo, InstanceInfo}</c> tuples, where <c>InstanceInfo</c> contains information about a specific instance of the allocator. As from <c>ERTS</c> 5.10.4, the returned list when calling <c>erlang:system_info({allocator, mseg_alloc})</c> also includes an <c>{erts_mmap, _}</c> tuple as one element in the list. If <c><anno>Alloc</anno></c> is not a recognized allocator, <c>undefined</c> is returned. If <c><anno>Alloc</anno></c> is disabled, <c>false</c> is returned.</p> <p>Notice that the information returned is highly implementation-dependent and can be changed or removed at any time without prior notice. It was initially intended as a tool when developing new allocators, but as it can be of interest for others it has been briefly documented.</p> <p>The recognized allocators are listed in <seealso marker="erts:erts_alloc">erts_alloc(3)</seealso>. After reading the <c>erts_alloc(3)</c> documentation, the returned information more or less speaks for itself, but it can be worth explaining some things. Call counts are presented by two values, the first value is giga calls, and the second value is calls. <c>mbcs</c> and <c>sbcs</c> denote multi-block carriers, and single-block carriers, respectively. Sizes are presented in bytes. When a size is not presented, it is the amount of something. Sizes and amounts are often presented by three values:</p> <list type="bulleted"> <item>The first is the current value.</item> <item>The second is the maximum value since the last call to <c>erlang:system_info({allocator, Alloc})</c>.</item> <item>The third is the maximum value since the emulator was started.</item> </list> <p>If only one value is present, it is the current value. <c>fix_alloc</c> memory block types are presented by two values. The first value is the memory pool size and the second value is the used memory size.</p> </item> <tag><c>{allocator_sizes, <anno>Alloc</anno>}</c></tag> <item> <marker id="system_info_allocator_sizes"></marker> <p>Returns various size information for the specified allocator. The information returned is a subset of the information returned by <seealso marker="#system_info_allocator_tuple"><c>erlang:system_info({allocator, <anno>Alloc</anno>})</c></seealso>. </p> </item> </taglist> </desc> </func> <func> <name name="system_info" arity="1" clause_i="10"/> <name name="system_info" arity="1" clause_i="11"/> <fsummary>Information about the CPU topology of the system.</fsummary> <type name="cpu_topology"/> <type name="level_entry"/> <type_desc name="cpu_topology"> All <c><anno>LevelEntry</anno></c>s of a list must contain the same <c><anno>LevelTag</anno></c>, except on the top level where both <c>node</c> and <c>processor</c> <c><anno>LevelTag</anno></c>s can coexist. </type_desc> <type_desc name="level_entry"> <c>{<anno>LevelTag</anno>, <anno>SubLevel</anno>} == {<anno>LevelTag</anno>, [], <anno>SubLevel</anno>}</c> </type_desc> <type name="level_tag"/> <type_desc name="level_tag"> More <c><anno>LevelTag</anno></c>s can be introduced in a future release. </type_desc> <type name="sub_level"/> <type name="info_list"/> <type_desc name="info_list"> The <c>info_list()</c> can be extended in a future release. </type_desc> <desc> <marker id="system_info_cpu_topology_tags"></marker> <marker id="system_info_cpu_topology"></marker> <p>Returns various information about the CPU topology of the current system (emulator) as specified by <c><anno>Item</anno></c>:</p> <taglist> <tag><c>cpu_topology</c></tag> <item> <p>Returns the <c><anno>CpuTopology</anno></c> currently used by the emulator. The CPU topology is used when binding schedulers to logical processors. The CPU topology used is the <seealso marker="erlang#system_info_cpu_topology_defined">user-defined CPU topology</seealso>, if such exists, otherwise the <seealso marker="erlang#system_info_cpu_topology_detected">automatically detected CPU topology</seealso>, if such exists. If no CPU topology exists, <c>undefined</c> is returned.</p> <p><c>node</c> refers to Non-Uniform Memory Access (NUMA) nodes. <c>thread</c> refers to hardware threads (for example, Intel hyper-threads).</p> <p>A level in term <c><anno>CpuTopology</anno></c> can be omitted if only one entry exists and <c><anno>InfoList</anno></c> is empty.</p> <p><c>thread</c> can only be a sub level to <c>core</c>. <c>core</c> can be a sub level to <c>processor</c> or <c>node</c>. <c>processor</c> can be on the top level or a sub level to <c>node</c>. <c>node</c> can be on the top level or a sub level to <c>processor</c>. That is, NUMA nodes can be processor internal or processor external. A CPU topology can consist of a mix of processor internal and external NUMA nodes, as long as each logical CPU belongs to <em>one</em> NUMA node. Cache hierarchy is not part of the <c><anno>CpuTopology</anno></c> type, but will be in a future release. Other things can also make it into the CPU topology in a future release. In other words, expect the <c><anno>CpuTopology</anno></c> type to change.</p> </item> <tag><c>{cpu_topology, defined}</c></tag> <item> <marker id="system_info_cpu_topology_defined"></marker> <p>Returns the user-defined <c><anno>CpuTopology</anno></c>. For more information, see command-line flag <seealso marker="erts:erl#+sct">+sct</seealso> in <c>erl(1)</c> and argument <seealso marker="#system_info_cpu_topology">cpu_topology</seealso>.</p> </item> <tag><c>{cpu_topology, detected}</c></tag> <item> <marker id="system_info_cpu_topology_detected"></marker> <p>Returns the automatically detected <c><anno>CpuTopology</anno>y</c>. The emulator detects the CPU topology on some newer Linux, Solaris, FreeBSD, and Windows systems. On Windows system with more than 32 logical processors, the CPU topology is not detected.</p> <p>For more information, see argument <seealso marker="#system_info_cpu_topology">cpu_topology</seealso>.</p> </item> <tag><c>{cpu_topology, used}</c></tag> <item> <p>Returns <c><anno>CpuTopology</anno></c> used by the emulator. For more information, see argument <seealso marker="#system_info_cpu_topology">cpu_topology</seealso>.</p> </item> </taglist> </desc> </func> <func> <name name="system_info" arity="1" clause_i="6"/> <name name="system_info" arity="1" clause_i="7"/> <name name="system_info" arity="1" clause_i="8"/> <name name="system_info" arity="1" clause_i="9"/> <name name="system_info" arity="1" clause_i="12"/> <name name="system_info" arity="1" clause_i="13"/> <name name="system_info" arity="1" clause_i="14"/> <name name="system_info" arity="1" clause_i="15"/> <name name="system_info" arity="1" clause_i="16"/> <name name="system_info" arity="1" clause_i="17"/> <name name="system_info" arity="1" clause_i="18"/> <name name="system_info" arity="1" clause_i="19"/> <name name="system_info" arity="1" clause_i="20"/> <name name="system_info" arity="1" clause_i="21"/> <name name="system_info" arity="1" clause_i="22"/> <name name="system_info" arity="1" clause_i="23"/> <name name="system_info" arity="1" clause_i="24"/> <name name="system_info" arity="1" clause_i="25"/> <name name="system_info" arity="1" clause_i="26"/> <name name="system_info" arity="1" clause_i="27"/> <name name="system_info" arity="1" clause_i="28"/> <name name="system_info" arity="1" clause_i="29"/> <name name="system_info" arity="1" clause_i="30"/> <name name="system_info" arity="1" clause_i="31"/> <name name="system_info" arity="1" clause_i="32"/> <name name="system_info" arity="1" clause_i="33"/> <name name="system_info" arity="1" clause_i="34"/> <name name="system_info" arity="1" clause_i="35"/> <name name="system_info" arity="1" clause_i="36"/> <name name="system_info" arity="1" clause_i="37"/> <name name="system_info" arity="1" clause_i="38"/> <name name="system_info" arity="1" clause_i="39"/> <name name="system_info" arity="1" clause_i="40"/> <name name="system_info" arity="1" clause_i="41"/> <name name="system_info" arity="1" clause_i="42"/> <name name="system_info" arity="1" clause_i="43"/> <name name="system_info" arity="1" clause_i="44"/> <name name="system_info" arity="1" clause_i="45"/> <name name="system_info" arity="1" clause_i="46"/> <name name="system_info" arity="1" clause_i="47"/> <name name="system_info" arity="1" clause_i="48"/> <name name="system_info" arity="1" clause_i="49"/> <name name="system_info" arity="1" clause_i="50"/> <name name="system_info" arity="1" clause_i="51"/> <name name="system_info" arity="1" clause_i="52"/> <name name="system_info" arity="1" clause_i="53"/> <name name="system_info" arity="1" clause_i="54"/> <name name="system_info" arity="1" clause_i="55"/> <name name="system_info" arity="1" clause_i="56"/> <name name="system_info" arity="1" clause_i="57"/> <name name="system_info" arity="1" clause_i="58"/> <name name="system_info" arity="1" clause_i="59"/> <name name="system_info" arity="1" clause_i="60"/> <name name="system_info" arity="1" clause_i="61"/> <name name="system_info" arity="1" clause_i="62"/> <name name="system_info" arity="1" clause_i="63"/> <name name="system_info" arity="1" clause_i="64"/> <name name="system_info" arity="1" clause_i="65"/> <name name="system_info" arity="1" clause_i="66"/> <name name="system_info" arity="1" clause_i="67"/> <fsummary>Information about the system.</fsummary> <desc> <p>Returns various information about the current system (emulator) as specified by <c><anno>Item</anno></c>:</p> <taglist> <tag><c>allocated_areas</c>, <c>allocator</c>, <c>alloc_util_allocators</c>, <c>allocator_sizes</c></tag> <item> <p>See <seealso marker="#system_info_allocator_tags">above</seealso>.</p> </item> <tag><c>build_type</c></tag> <item> <p>Returns an atom describing the build type of the runtime system. This is normally the atom <c>opt</c> for optimized. Other possible return values are <c>debug</c>, <c>purify</c>, <c>quantify</c>, <c>purecov</c>, <c>gcov</c>, <c>valgrind</c>, <c>gprof</c>, and <c>lcnt</c>. Possible return values can be added or removed at any time without prior notice.</p> </item> <tag><c>c_compiler_used</c></tag> <item> <p>Returns a two-tuple describing the C compiler used when compiling the runtime system. The first element is an atom describing the name of the compiler, or <c>undefined</c> if unknown. The second element is a term describing the version of the compiler, or <c>undefined</c> if unknown.</p> </item> <tag><c>check_io</c></tag> <item> <p>Returns a list containing miscellaneous information about the emulators internal I/O checking. Notice that the content of the returned list can vary between platforms and over time. It is only guaranteed that a list is returned.</p> </item> <tag><c>compat_rel</c></tag> <item> <p>Returns the compatibility mode of the local node as an integer. The integer returned represents the Erlang/OTP release that the current emulator has been set to be backward compatible with. The compatibility mode can be configured at startup by using command-line flag <seealso marker="erts:erl#compat_rel">+R</seealso> in <c>erl(1)</c>.</p> </item> <tag><c>cpu_topology</c></tag> <item> <p>See <seealso marker="#system_info_cpu_topology_tags">above</seealso>.</p> </item> <tag><c>creation</c></tag> <item> <p>Returns the creation of the local node as an integer. The creation is changed when a node is restarted. The creation of a node is stored in process identifiers, port identifiers, and references. This makes it (to some extent) possible to distinguish between identifiers from different incarnations of a node. The valid creations are integers in the range 1..3, but this will probably change in a future release. If the node is not alive, <c>0</c> is returned.</p> </item> <tag><c>debug_compiled</c></tag> <item> <p>Returns <c>true</c> if the emulator has been debug compiled, otherwise <c>false</c>.</p> </item> <tag><c>delayed_node_table_gc</c></tag> <item> <marker id="system_info_delayed_node_table_gc"></marker> <p>Returns the amount of time in seconds garbage collection of an entry in a node table is delayed. This limit can be set on startup by passing the command line flag <seealso marker="erts:erl#+zdntgc">+zdntgc</seealso> to <c>erl</c>. For more information see the documentation of the command line flag.</p> </item> <tag><c>dirty_cpu_schedulers</c></tag> <item> <marker id="system_info_dirty_cpu_schedulers"></marker> <p>Returns the number of dirty CPU scheduler threads used by the emulator. Dirty CPU schedulers execute CPU-bound native functions, such as NIFs, linked-in driver code, and BIFs that cannot be managed cleanly by the normal emulator schedulers.</p> <p>The number of dirty CPU scheduler threads is determined at emulator boot time and cannot be changed after that. However, the number of dirty CPU scheduler threads online can be changed at any time. The number of dirty CPU schedulers can be set at startup by passing command-line flag <seealso marker="erts:erl#+SDcpu">+SDcpu</seealso> or <seealso marker="erts:erl#+SDPcpu">+SDPcpu</seealso> in <c>erl(1)</c>.</p> <p>Notice that the dirty schedulers functionality is experimental. Enable support for dirty schedulers when building OTP to try out the functionality.</p> <p>See also <seealso marker="#system_flag_dirty_cpu_schedulers_online">erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)</seealso>, <seealso marker="#system_info_dirty_cpu_schedulers_online">erlang:system_info(dirty_cpu_schedulers_online)</seealso>, <seealso marker="#system_info_dirty_io_schedulers">erlang:system_info(dirty_io_schedulers)</seealso>, <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>, <seealso marker="#system_info_schedulers_online">erlang:system_info(schedulers_online)</seealso>, and <seealso marker="#system_flag_schedulers_online">erlang:system_flag(schedulers_online, SchedulersOnline)</seealso>.</p> </item> <tag><c>dirty_cpu_schedulers_online</c></tag> <item> <marker id="system_info_dirty_cpu_schedulers_online"></marker> <p>Returns the number of dirty CPU schedulers online. The return value satisfies <c><![CDATA[1 <= DirtyCPUSchedulersOnline <= N]]></c>, where <c>N</c> is the smallest of the return values of <c>erlang:system_info(dirty_cpu_schedulers)</c> and <c>erlang:system_info(schedulers_online)</c>.</p> <p>The number of dirty CPU schedulers online can be set at startup by passing command-line flag <seealso marker="erts:erl#+SDcpu">+SDcpu</seealso> in <c>erl(1)</c>.</p> <p>Notice that the dirty schedulers functionality is experimental. Enable support for dirty schedulers when building OTP to try out the functionality.</p> <p>For more information, see <seealso marker="#system_info_dirty_cpu_schedulers">erlang:system_info(dirty_cpu_schedulers)</seealso>, <seealso marker="#system_info_dirty_io_schedulers">erlang:system_info(dirty_io_schedulers)</seealso>, <seealso marker="#system_info_schedulers_online">erlang:system_info(schedulers_online)</seealso>, and <seealso marker="#system_flag_dirty_cpu_schedulers_online">erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)</seealso>.</p> </item> <tag><c>dirty_io_schedulers</c></tag> <item> <marker id="system_info_dirty_io_schedulers"></marker> <p>Returns the number of dirty I/O schedulers as an integer. Dirty I/O schedulers execute I/O-bound native functions, such as NIFs and linked-in driver code, which cannot be managed cleanly by the normal emulator schedulers.</p> <p>This value can be set at startup by passing command-line argument <seealso marker="erts:erl#+SDio">+SDio</seealso> in <c>erl(1)</c>.</p> <p>Notice that the dirty schedulers functionality is experimental. Enable support for dirty schedulers when building OTP to try out the functionality.</p> <p>For more information, see <seealso marker="#system_info_dirty_cpu_schedulers">erlang:system_info(dirty_cpu_schedulers)</seealso>, <seealso marker="#system_info_dirty_cpu_schedulers_online">erlang:system_info(dirty_cpu_schedulers_online)</seealso>, and <seealso marker="#system_flag_dirty_cpu_schedulers_online">erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)</seealso>.</p> </item> <tag><c>dist</c></tag> <item> <p>Returns a binary containing a string of distribution information formatted as in Erlang crash dumps. For more information, see Section <seealso marker="erts:crash_dump">"How to interpret the Erlang crash dumps"</seealso> in the User's Guide.</p> </item> <tag><c>dist_buf_busy_limit</c></tag> <item> <marker id="system_info_dist_buf_busy_limit"></marker> <p>Returns the value of the distribution buffer busy limit in bytes. This limit can be set at startup by passing command-line flag <seealso marker="erts:erl#+zdbbl">+zdbbl</seealso> to <c>erl</c>.</p> </item> <tag><c>dist_ctrl</c></tag> <item> <p>Returns a list of tuples <c>{<anno>Node</anno>, <anno>ControllingEntity</anno>}</c>, one entry for each connected remote node. <c><anno>Node</anno></c> is the node name and <c><anno>ControllingEntity</anno></c> is the port or process identifier responsible for the communication to that node. More specifically, <c><anno>ControllingEntity</anno></c> for nodes connected through TCP/IP (the normal case) is the socket used in communication with the specific node.</p> </item> <tag><c>driver_version</c></tag> <item> <p>Returns a string containing the Erlang driver version used by the runtime system. It has the form <seealso marker="erts:erl_driver#version_management">"<major ver>.<minor ver>"</seealso>.</p> </item> <tag><c>dynamic_trace</c></tag> <item> <p>Returns an atom describing the dynamic trace framework compiled into the virtual machine. It can be <c>dtrace</c>, <c>systemtap</c>, or <c>none</c>. For a commercial or standard build, it is always <c>none</c>. The other return values indicate a custom configuration (for example, <c>./configure --with-dynamic-trace=dtrace</c>). For more information about dynamic tracing, see the <seealso marker="runtime_tools:dyntrace">dyntrace</seealso> manual page and the <c>README.dtrace</c>/<c>README.systemtap</c> files in the Erlang source code top directory.</p> </item> <tag><c>dynamic_trace_probes</c></tag> <item> <p>Returns a <c>boolean()</c> indicating if dynamic trace probes (<c>dtrace</c> or <c>systemtap</c>) are built into the emulator. This can only be <c>true</c> if the Virtual Machine was built for dynamic tracing (that is, <c>system_info(dynamic_trace)</c> returns <c>dtrace</c> or <c>systemtap</c>).</p> </item> <tag><marker id="system_info_end_time"/><c>end_time</c></tag> <item><p>The last <seealso marker="#monotonic_time/0">Erlang monotonic time</seealso> in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso> that can be represented internally in the current Erlang runtime system instance. The time between the <seealso marker="#system_info_start_time">start time</seealso> and the end time is at least a quarter of a millennium.</p></item> <tag><c>elib_malloc</c></tag> <item> <p>This option will be removed in a future release. The return value will always be <c>false</c>, as the <c>elib_malloc</c> allocator has been removed.</p> </item> <tag><marker id="system_info_eager_check_io"/><c>eager_check_io</c></tag> <item> <p> Returns the value of the <c>erl</c> command line flag <seealso marker="erl#+secio">+secio</seealso> which is either <c>true</c> or <c>false</c>. See the documentation of the command line flag for information about the different values. </p> </item> <tag><c>ets_limit</c></tag> <item> <p>Returns the maximum number of ETS tables allowed. This limit can be increased at startup by passing command-line flag <seealso marker="erts:erl#+e">+e</seealso> to <c>erl(1)</c> or by setting environment variable <c>ERL_MAX_ETS_TABLES</c> before starting the Erlang runtime system.</p> </item> <tag><c>fullsweep_after</c></tag> <item> <p>Returns <c>{fullsweep_after, integer() >= 0}</c>, which is the <c>fullsweep_after</c> garbage collection setting used by default. For more information, see <c>garbage_collection</c> described in the following.</p> </item> <tag><c>garbage_collection</c></tag> <item> <p>Returns a list describing the default garbage collection settings. A process spawned on the local node by a <c>spawn</c> or <c>spawn_link</c> uses these garbage collection settings. The default settings can be changed by using <seealso marker="#system_flag/2">system_flag/2</seealso>. <seealso marker="#spawn_opt/4">spawn_opt/4</seealso> can spawn a process that does not use the default settings.</p> </item> <tag><c>heap_sizes</c></tag> <item> <p>Returns a list of integers representing valid heap sizes in words. All Erlang heaps are sized from sizes in this list.</p> </item> <tag><c>heap_type</c></tag> <item> <p>Returns the heap type used by the current emulator. One heap type exists:</p> <taglist> <tag><c>private</c></tag> <item> <p>Each process has a heap reserved for its use and no references between heaps of different processes are allowed. Messages passed between processes are copied between heaps.</p> </item> </taglist> </item> <tag><c>info</c></tag> <item> <p>Returns a binary containing a string of miscellaneous system information formatted as in Erlang crash dumps. For more information, see Section <seealso marker="erts:crash_dump">"How to interpret the Erlang crash dumps"</seealso> in the User's Guide.</p> </item> <tag><c>kernel_poll</c></tag> <item> <p>Returns <c>true</c> if the emulator uses some kind of kernel-poll implementation, otherwise <c>false</c>.</p> </item> <tag><c>loaded</c></tag> <item> <p>Returns a binary containing a string of loaded module information formatted as in Erlang crash dumps. For more information, see Section <seealso marker="erts:crash_dump">"How to interpret the Erlang crash dumps"</seealso> in the User's Guide.</p> </item> <tag><c>logical_processors</c></tag> <item> <marker id="logical_processors"></marker> <p>Returns the detected number of logical processors configured in the system. The return value is either an integer, or the atom <c>unknown</c> if the emulator cannot detect the configured logical processors.</p> </item> <tag><c>logical_processors_available</c></tag> <item> <marker id="logical_processors_available"></marker> <p>Returns the detected number of logical processors available to the Erlang runtime system. The return value is either an integer, or the atom <c>unknown</c> if the emulator cannot detect the available logical processors. The number of available logical processors is less than or equal to the number of <seealso marker="#logical_processors_online">logical processors online</seealso>.</p> </item> <tag><c>logical_processors_online</c></tag> <item> <marker id="logical_processors_online"></marker> <p>Returns the detected number of logical processors online on the system. The return value is either an integer, or the atom <c>unknown</c> if the emulator cannot detect logical processors online. The number of logical processors online is less than or equal to the number of <seealso marker="#logical_processors">logical processors configured</seealso>.</p> </item> <tag><c>machine</c></tag> <item> <p>Returns a string containing the Erlang machine name.</p> </item> <tag><c>min_heap_size</c></tag> <item> <p>Returns <c>{min_heap_size, <anno>MinHeapSize</anno>}</c>, where <c><anno>MinHeapSize</anno></c> is the current system-wide minimum heap size for spawned processes.</p> </item> <tag><c>min_bin_vheap_size</c></tag> <item> <p>Returns <c>{min_bin_vheap_size, <anno>MinBinVHeapSize</anno>}</c>, where <c><anno>MinBinVHeapSize</anno></c> is the current system-wide minimum binary virtual heap size for spawned processes.</p> </item> <tag><c>modified_timing_level</c></tag> <item> <p>Returns the modified timing-level (an integer) if modified timing is enabled, otherwise, <c>undefined</c>. For more information about modified timing, see command-line flag <seealso marker="erts:erl#+T">+T</seealso> in <c>erl(1)</c></p> </item> <tag><c>multi_scheduling</c></tag> <item> <marker id="system_info_multi_scheduling"></marker> <p>Returns <c>disabled</c>, <c>blocked</c>, or <c>enabled</c>:</p> <taglist> <tag><c>disabled</c></tag> <item> <p>The emulator has only one scheduler thread. The emulator does not have SMP support, or have been started with only one scheduler thread.</p> </item> <tag><c>blocked</c></tag> <item> <p>The emulator has more than one scheduler thread, but all scheduler threads except one are blocked, that is, only one scheduler thread schedules Erlang processes and executes Erlang code.</p> </item> <tag><c>enabled</c></tag> <item> <p>The emulator has more than one scheduler thread, and no scheduler threads are blocked, that is, all available scheduler threads schedule Erlang processes and execute Erlang code.</p> </item> </taglist> <p>See also <seealso marker="#system_flag_multi_scheduling">erlang:system_flag(multi_scheduling, BlockState)</seealso>, <seealso marker="#system_info_multi_scheduling_blockers">erlang:system_info(multi_scheduling_blockers)</seealso>, and <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>.</p> </item> <tag><c>multi_scheduling_blockers</c></tag> <item> <marker id="system_info_multi_scheduling_blockers"></marker> <p>Returns a list of <c><anno>Pid</anno></c>s when multi-scheduling is blocked, otherwise the empty list is returned. The <c><anno>Pid</anno></c>s in the list represent all the processes currently blocking multi-scheduling. A <c><anno>Pid</anno></c> occurs only once in the list, even if the corresponding process has blocked multiple times.</p> <p>See also <seealso marker="#system_flag_multi_scheduling">erlang:system_flag(multi_scheduling, BlockState)</seealso>, <seealso marker="#system_info_multi_scheduling">erlang:system_info(multi_scheduling)</seealso>, and <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>.</p> </item> <tag><c>nif_version</c></tag> <item> <p>Returns a string containing the version of the Erlang NIF interface used by the runtime system. It is on the form "<major ver>.<minor ver>".</p> </item> <tag><c>otp_release</c></tag> <item> <marker id="system_info_otp_release"></marker> <p>Returns a string containing the OTP release number of the OTP release that the currently executing <c>ERTS</c> application is part of.</p> <p>As from OTP 17, the OTP release number corresponds to the major OTP version number. No <c>erlang:system_info()</c> argument gives the exact OTP version. This is because the exact OTP version in the general case is difficult to determine. For more information, see the description of versions in <seealso marker="doc/system_principles:versions"> System principles</seealso> in System Documentation.</p> </item> <tag><marker id="system_info_os_monotonic_time_source"/><c>os_monotonic_time_source</c></tag> <item> <p>Returns a list containing information about the source of <seealso marker="erts:time_correction#OS_Monotonic_Time">OS monotonic time</seealso> that is used by the runtime system.</p> <p>If <c>[]</c> is returned, no OS monotonic time is available. The list contains two-tuples with <c>Key</c>s as first element, and <c>Value</c>s as second element. The order of these tuples is undefined. The following tuples can be part of the list, but more tuples can be introduced in the future:</p> <taglist> <tag><c>{function, Function}</c></tag> <item><p><c>Function</c> is the name of the function used. This tuple always exist if OS monotonic time is available to the runtime system.</p></item> <tag><c>{clock_id, ClockId}</c></tag> <item><p>This tuple only exist if <c>Function</c> can be used with different clocks. <c>ClockId</c> corresponds to the clock identifier used when calling <c>Function</c>.</p></item> <tag><c>{resolution, OsMonotonicTimeResolution}</c></tag> <item><p>Highest possible <seealso marker="time_correction#Time_Resolution">resolution</seealso> of current OS monotonic time source as parts per second. If no resolution information can be retrieved from the OS, <c>OsMonotonicTimeResolution</c> is set to the resolution of the time unit of <c>Function</c>s return value. That is, the actual resolution can be lower than <c>OsMonotonicTimeResolution</c>. Also note that the resolution does not say anything about the <seealso marker="time_correction#Time_Accuracy">accuracy</seealso>, and whether the <seealso marker="time_correction#Time_Precision">precision</seealso> do align with the resolution. You do, however, know that the precision is not better than <c>OsMonotonicTimeResolution</c>.</p></item> <tag><c>{extended, Extended}</c></tag> <item><p><c>Extended</c> equals <c>yes</c> if the range of time values has been extended; otherwise, <c>Extended</c> equals <c>no</c>. The range needs to be extended if <c>Function</c> returns values that wrap fast. This typically is the case when the return value is a 32-bit value.</p></item> <tag><c>{parallel, Parallel}</c></tag> <item><p><c>Parallel</c> equals <c>yes</c> if <c>Function</c> is called in parallel from multiple threads. If it is not called in parallel, because calls needs to be serialized, <c>Parallel</c> equals <c>no</c>.</p></item> <tag><c>{time, OsMonotonicTime}</c></tag> <item><p><c>OsMonotonicTime</c> equals current OS monotonic time in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso>.</p></item> </taglist> </item> <tag><marker id="system_info_os_system_time_source"/><c>os_system_time_source</c></tag> <item> <p>Returns a list containing information about the source of <seealso marker="erts:time_correction#OS_System_Time">OS system time</seealso> that is used by the runtime system.</p> <p>The list contains two-tuples with <c>Key</c>s as first element, and <c>Value</c>s as second element. The order if these tuples is undefined. The following tuples can be part of the list, but more tuples can be introduced in the future:</p> <taglist> <tag><c>{function, Function}</c></tag> <item><p><c>Function</c> is the name of the funcion used.</p></item> <tag><c>{clock_id, ClockId}</c></tag> <item><p>This tuple only exist if <c>Function</c> can be used with different clocks. <c>ClockId</c> corresponds to the clock identifier used when calling <c>Function</c>.</p></item> <tag><c>{resolution, OsSystemTimeResolution}</c></tag> <item><p>Highest possible <seealso marker="time_correction#Time_Resolution">resolution</seealso> of current OS system time source as parts per second. If no resolution information can be retrieved from the OS, <c>OsSystemTimeResolution</c> is set to the resolution of the time unit of <c>Function</c>s return value. That is, the actual resolution may be lower than <c>OsSystemTimeResolution</c>. Also note that the resolution does not say anything about the <seealso marker="time_correction#Time_Accuracy">accuracy</seealso>, and whether the <seealso marker="time_correction#Time_Precision">precision</seealso> do align with the resolution. You do, however, know that the precision is not better than <c>OsSystemTimeResolution</c>.</p></item> <tag><c>{parallel, Parallel}</c></tag> <item><p><c>Parallel</c> equals <c>yes</c> if <c>Function</c> is called in parallel from multiple threads. If it is not called in parallel, because calls needs to be serialized, <c>Parallel</c> equals <c>no</c>.</p></item> <tag><c>{time, OsSystemTime}</c></tag> <item><p><c>OsSystemTime</c> equals current OS system time in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso>.</p></item> </taglist> </item> <tag><c>port_parallelism</c></tag> <item> <marker id="system_info_port_parallelism"></marker> <p>Returns the default port parallelism scheduling hint used. For more information, see command-line argument <seealso marker="erl#+spp">+spp</seealso> in <c>erl(1)</c>.</p></item> <tag><marker id="system_info_port_count"/><c>port_count</c></tag> <item> <p>Returns the number of ports currently existing at the local node. The value is given as an integer. This is the same value as returned by <c>length(erlang:ports())</c>, but more efficient.</p> </item> <tag><c>port_limit</c></tag> <item> <marker id="system_info_port_limit"></marker> <p>Returns the maximum number of simultaneously existing ports at the local node as an integer. This limit can be configured at startup by using command-line flag <seealso marker="erl#+Q">+Q</seealso> in <c>erl(1)</c>.</p> </item> <tag><marker id="system_info_process_count"/><c>process_count</c></tag> <item> <p>Returns the number of processes currently existing at the local node. The value is given as an integer. This is the same value as returned by <c>length(processes())</c>, but more efficient.</p> </item> <tag><c>process_limit</c></tag> <item> <marker id="system_info_process_limit"></marker> <p>Returns the maximum number of simultaneously existing processes at the local node. The value is given as an integer. This limit can be configured at startup by using command-line flag <seealso marker="erl#+P">+P</seealso> in <c>erl(1)</c>.</p> </item> <tag><c>procs</c></tag> <item> <p>Returns a binary containing a string of process and port information formatted as in Erlang crash dumps. For more information, see Section <seealso marker="erts:crash_dump">"How to interpret the Erlang crash dumps"</seealso> in the User's Guide.</p> </item> <tag><c>scheduler_bind_type</c></tag> <item> <marker id="system_info_scheduler_bind_type"></marker> <p>Returns information about how the user has requested schedulers to be bound or not bound.</p> <p>Notice that even though a user has requested schedulers to be bound, they can silently have failed to bind. To inspect the scheduler bindings, call <seealso marker="#system_info_scheduler_bindings">erlang:system_info(scheduler_bindings)</seealso>.</p> <p>For more information, see command-line argument <seealso marker="erts:erl#+sbt">+sbt</seealso> in <c>erl(1)</c> and <seealso marker="#system_info_scheduler_bindings">erlang:system_info(scheduler_bindings)</seealso>.</p> </item> <tag><c>scheduler_bindings</c></tag> <item> <marker id="system_info_scheduler_bindings"></marker> <p>Returns information about the currently used scheduler bindings.</p> <p>A tuple of a size equal to <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso> is returned. The tuple elements are integers or the atom <c>unbound</c>. Logical processor identifiers are represented as integers. The <c>N</c>th element of the tuple equals the current binding for the scheduler with the scheduler identifier equal to <c>N</c>. For example, if the schedulers are bound, <c>element(erlang:system_info(scheduler_id), erlang:system_info(scheduler_bindings))</c> returns the identifier of the logical processor that the calling process is executing on.</p> <p>Notice that only schedulers online can be bound to logical processors.</p> <p>For more information, see command-line argument <seealso marker="erts:erl#+sbt">+sbt</seealso> in <c>erl(1)</c> and <seealso marker="#system_info_schedulers_online">erlang:system_info(schedulers_online)</seealso>. </p> </item> <tag><c>scheduler_id</c></tag> <item> <marker id="system_info_scheduler_id"></marker> <p>Returns the scheduler ID (<c>SchedulerId</c>) of the scheduler thread that the calling process is executing on. <c><anno>SchedulerId</anno></c> is a positive integer, where <c><![CDATA[1 <= SchedulerId <= erlang:system_info(schedulers)]]></c>. See also <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>.</p> </item> <tag><c>schedulers</c></tag> <item> <marker id="system_info_schedulers"></marker> <p>Returns the number of scheduler threads used by the emulator. Scheduler threads online schedules Erlang processes and Erlang ports, and execute Erlang code and Erlang linked-in driver code.</p> <p>The number of scheduler threads is determined at emulator boot time and cannot be changed later. However, the number of schedulers online can be changed at any time.</p> <p>See also <seealso marker="#system_flag_schedulers_online">erlang:system_flag(schedulers_online, SchedulersOnline)</seealso>, <seealso marker="#system_info_schedulers_online">erlang:system_info(schedulers_online)</seealso>, <seealso marker="#system_info_scheduler_id">erlang:system_info(scheduler_id)</seealso>, <seealso marker="#system_flag_multi_scheduling">erlang:system_flag(multi_scheduling, BlockState)</seealso>, <seealso marker="#system_info_multi_scheduling">erlang:system_info(multi_scheduling)</seealso>, and <seealso marker="#system_info_multi_scheduling_blockers">erlang:system_info(multi_scheduling_blockers)</seealso>.</p> </item> <tag><c>schedulers_online</c></tag> <item> <marker id="system_info_schedulers_online"></marker> <p>Returns the number of schedulers online. The scheduler identifiers of schedulers online satisfy the relationship <c><![CDATA[1 <= SchedulerId <= erlang:system_info(schedulers_online)]]></c>.</p> <p>For more information, see <seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso> and <seealso marker="#system_flag_schedulers_online">erlang:system_flag(schedulers_online, SchedulersOnline)</seealso>.</p> </item> <tag><c>smp_support</c></tag> <item> <p>Returns <c>true</c> if the emulator has been compiled with SMP support, otherwise <c>false</c> is returned.</p> </item> <tag><marker id="system_info_start_time"/><c>start_time</c></tag> <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. 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 some important properties, such as the number of schedulers.</p> </item> <tag><c>system_architecture</c></tag> <item> <p>Returns a string containing the processor and OS architecture the emulator is built for.</p> </item> <tag><c>threads</c></tag> <item> <p>Returns <c>true</c> if the emulator has been compiled with thread support, otherwise <c>false</c> is returned.</p> </item> <tag><c>thread_pool_size</c></tag> <item> <marker id="system_info_thread_pool_size"></marker> <p>Returns the number of async threads in the async thread pool used for asynchronous driver calls (<seealso marker="erts:erl_driver#driver_async">driver_async()</seealso>). The value is given as an integer.</p> </item> <tag><c>time_correction</c></tag> <item> <marker id="system_info_time_correction"></marker> <p>Returns a boolean value indicating whether <seealso marker="time_correction#Time_Correction">time correction</seealso> is enabled or not. </p></item> <tag><c>time_offset</c></tag> <item> <marker id="system_info_time_offset"></marker> <p>Returns the state of the time offset:</p> <taglist> <tag><c>preliminary</c></tag> <item><p>The time offset is preliminary, and will be changed at a later time when being finalized. The preliminary time offset is used during the preliminary phase of the <seealso marker="time_correction#Single_Time_Warp_Mode">single time warp mode</seealso>.</p></item> <tag><c>final</c></tag> <item><p>The time offset is final. This either because <seealso marker="time_correction#No_Time_Warp_Mode">no time warp mode</seealso> is used, or because the time offset have been finalized when <seealso marker="time_correction#Single_Time_Warp_Mode">single time warp mode</seealso> is used.</p></item> <tag><c>volatile</c></tag> <item><p>The time offset is volatile. That is, it can change at any time. This is because <seealso marker="time_correction#Multi_Time_Warp_Mode">multi time warp mode</seealso> is used.</p></item> </taglist> </item> <tag><marker id="system_info_time_warp_mode"/><c>time_warp_mode</c></tag> <item><p>Returns a value identifying the <seealso marker="time_correction#Time_Warp_Modes">time warp mode</seealso> being used:</p> <taglist> <tag><c>no_time_warp</c></tag> <item><p>The <seealso marker="time_correction#No_Time_Warp_Mode">no time warp mode</seealso> is used.</p></item> <tag><c>single_time_warp</c></tag> <item><p>The <seealso marker="time_correction#Single_Time_Warp_Mode">single time warp mode</seealso> is used.</p></item> <tag><c>multi_time_warp</c></tag> <item><p>The <seealso marker="time_correction#Multi_Time_Warp_Mode">multi time warp mode</seealso> is used.</p></item> </taglist> </item> <tag><c>tolerant_timeofday</c></tag> <item> <marker id="system_info_tolerant_timeofday"></marker> <p>Returns whether a pre erts-7.0 backwards compatible compensation for sudden changes of system time is <c>enabled</c> or <c>disabled</c>. Such compensation is <c>enabled</c> when the <seealso marker="#system_info_time_offset">time offset</seealso> is <c>final</c>, and <seealso marker="#system_info_time_correction">time correction</seealso> is enabled.</p> </item> <tag><c>trace_control_word</c></tag> <item> <p>Returns the value of the node trace control word. For more information, see function <c>get_tcw</c> in Section <seealso marker="erts:match_spec#get_tcw">Match Specifications in Erlang</seealso> in the User's Guide.</p> </item> <tag><c>update_cpu_info</c></tag> <item> <marker id="update_cpu_info"></marker> <p>The runtime system rereads the CPU information available and updates its internally stored information about the <seealso marker="#system_info_cpu_topology_detected">detected CPU topology</seealso> and the number of logical processors <seealso marker="#logical_processors">configured</seealso>, <seealso marker="#logical_processors_online">online</seealso>, and <seealso marker="#logical_processors_available">available</seealso>.</p> <p>If the CPU information has changed since the last time it was read, the atom <c>changed</c> is returned, otherwise the atom <c>unchanged</c>. If the CPU information has changed, you probably want to <seealso marker="#system_flag_schedulers_online">adjust the number of schedulers online</seealso>. You typically want to have as many schedulers online as <seealso marker="#logical_processors_available">logical processors available</seealso>.</p> </item> <tag><c>version</c></tag> <item> <marker id="system_info_version"></marker> <p>Returns a string containing the version number of the emulator.</p> </item> <tag><c>wordsize</c></tag> <item> <p>Same as <c>{wordsize, internal}</c>.</p> </item> <tag><c>{wordsize, internal}</c></tag> <item> <p>Returns the size of Erlang term words in bytes as an integer, that is, 4 is returned on a 32-bit architecture, and 8 is returned on a pure 64-bit architecture. On a halfword 64-bit emulator, 4 is returned, as the Erlang terms are stored using a virtual word size of half the system word size.</p> </item> <tag><c>{wordsize, external}</c></tag> <item> <p>Returns the true word size of the emulator, that is, the size of a pointer. The value is given in bytes as an integer. On a pure 32-bit architecture, 4 is returned. On both a half word and on a pure 64-bit architecture, 8 is returned.</p> </item> </taglist> <note> <p>Argument <c>scheduler</c> has changed name to <c>scheduler_id</c> to avoid mix up with argument <c>schedulers</c>. Argument <c>scheduler</c> was introduced in <c>ERTS</c> 5.5 and renamed in <c>ERTS</c> 5.5.1.</p> </note> </desc> </func> <func> <name name="system_monitor" arity="0"/> <fsummary>Current system performance monitoring settings.</fsummary> <type name="system_monitor_option"/> <desc> <p>Returns the current system monitoring settings set by <seealso marker="#system_monitor/2">erlang:system_monitor/2</seealso> as <c>{<anno>MonitorPid</anno>, <anno>Options</anno>}</c>, or <c>undefined</c> if there are no settings. The order of the options can be different from the one that was set.</p> </desc> </func> <func> <name name="system_monitor" arity="1"/> <fsummary>Sets or clears system performance monitoring options.</fsummary> <type name="system_monitor_option"/> <desc> <p>When called with argument <c>undefined</c>, all system performance monitoring settings are cleared.</p> <p>Calling the function with <c>{<anno>MonitorPid</anno>, <anno>Options</anno>}</c> as argument is the same as calling <seealso marker="#system_monitor/2"><c>erlang:system_monitor(<anno>MonitorPid</anno>, <anno>Options</anno>)</c></seealso>.</p> <p>Returns the previous system monitor settings just like <seealso marker="#system_monitor/0">erlang:system_monitor/0</seealso>.</p> </desc> </func> <func> <name name="system_monitor" arity="2"/> <fsummary>Sets system performance monitoring options.</fsummary> <type name="system_monitor_option"/> <desc> <p>Sets the system performance monitoring options. <c><anno>MonitorPid</anno></c> is a local process identifier (pid) receiving system monitor messages. The second argument is a list of monitoring options:</p> <taglist> <tag><c>{long_gc, Time}</c></tag> <item> <p>If a garbage collection in the system takes at least <c>Time</c> wall clock milliseconds, a message <c>{monitor, GcPid, long_gc, Info}</c> is sent to <c><anno>MonitorPid</anno></c>. <c>GcPid</c> is the pid that was garbage collected. <c>Info</c> is a list of two-element tuples describing the result of the garbage collection.</p> <p>One of the tuples is <c>{timeout, GcTime}</c>, where <c>GcTime</c> is the time for the garbage collection in milliseconds. The other tuples are tagged with <c>heap_size</c>, <c>heap_block_size</c> <c>stack_size</c>, <c>mbuf_size</c>, <c>old_heap_size</c>, and <c>old_heap_block_size</c>. These tuples are explained in the description of trace message <seealso marker="#gc_start">gc_start</seealso> (see <seealso marker="#trace/3">erlang:trace/3</seealso>). New tuples can be added, and the order of the tuples in the <c>Info</c> list can be changed at any time without prior notice.</p> </item> <tag><c>{long_schedule, Time}</c></tag> <item> <p>If a process or port in the system runs uninterrupted for at least <c>Time</c> wall clock milliseconds, a message <c>{monitor, PidOrPort, long_schedule, Info}</c> is sent to <c>MonitorPid</c>. <c>PidOrPort</c> is the process or port that was running. <c>Info</c> is a list of two-element tuples describing the event.</p> <p>If a <c>pid()</c>, the tuples <c>{timeout, Millis}</c>, <c>{in, Location}</c>, and <c>{out, Location}</c> are present, where <c>Location</c> is either an MFA (<c>{Module, Function, Arity}</c>) describing the function where the process was scheduled in/out, or the atom <c>undefined</c>.</p> <p>If a <c>port()</c>, the tuples <c>{timeout, Millis}</c> and <c>{port_op,Op}</c> are present. <c>Op</c> is one of <c>proc_sig</c>, <c>timeout</c>, <c>input</c>, <c>output</c>, <c>event</c>, or <c>dist_cmd</c>, depending on which driver callback was executing.</p> <p><c>proc_sig</c> is an internal operation and is never to appear, while the others represent the corresponding driver callbacks <c>timeout</c>, <c>ready_input</c>, <c>ready_output</c>, <c>event</c>, and <c>outputv</c> (when the port is used by distribution). Value <c>Millis</c> in the <c>timeout</c> tuple informs about the uninterrupted execution time of the process or port, which always is equal to or higher than the <c>Time</c> value supplied when starting the trace. New tuples can be added to the <c>Info</c> list in a future release. The order of the tuples in the list can be changed at any time without prior notice.</p> <p>This can be used to detect problems with NIFs or drivers that take too long to execute. 1 ms is considered a good maximum time for a driver callback or a NIF. However, a time-sharing system is usually to consider everything below 100 ms as "possible" and fairly "normal". However, longer schedule times can indicate swapping or a misbehaving NIF/driver. Misbehaving NIFs and drivers can cause bad resource utilization and bad overall system performance.</p> </item> <tag><c>{large_heap, Size}</c></tag> <item> <p>If a garbage collection in the system results in the allocated size of a heap being at least <c>Size</c> words, a message <c>{monitor, GcPid, large_heap, Info}</c> is sent to <c><anno>MonitorPid</anno></c>. <c>GcPid</c> and <c>Info</c> are the same as for <c>long_gc</c> earlier, except that the tuple tagged with <c>timeout</c> is not present.</p> <p>As of <c>ERTS</c> 5.6, the monitor message is sent if the sum of the sizes of all memory blocks allocated for all heap generations is equal to or higher than <c>Size</c>. Previously the monitor message was sent if the memory block allocated for the youngest generation was equal to or higher than <c>Size</c>.</p> </item> <tag><c>busy_port</c></tag> <item> <p>If a process in the system gets suspended because it sends to a busy port, a message <c>{monitor, SusPid, busy_port, Port}</c> is sent to <c><anno>MonitorPid</anno></c>. <c>SusPid</c> is the pid that got suspended when sending to <c>Port</c>.</p> </item> <tag><c>busy_dist_port</c></tag> <item> <p>If a process in the system gets suspended because it sends to a process on a remote node whose inter-node communication was handled by a busy port, a message <c>{monitor, SusPid, busy_dist_port, Port}</c> is sent to <c><anno>MonitorPid</anno></c>. <c>SusPid</c> is the pid that got suspended when sending through the inter-node communication port <c>Port</c>.</p> </item> </taglist> <p>Returns the previous system monitor settings just like <seealso marker="#system_monitor/0">erlang:system_monitor/0</seealso>.</p> <note> <p>If a monitoring process gets so large that it itself starts to cause system monitor messages when garbage collecting, the messages enlarge the process message queue and probably make the problem worse.</p> <p>Keep the monitoring process neat and do not set the system monitor limits too tight.</p> </note> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>If <c><anno>MonitorPid</anno></c> does not exist.</item> <tag><c>badarg</c></tag> <item>If <c><anno>MonitorPid</anno></c> is not a local process.</item> </taglist> </desc> </func> <func> <name name="system_profile" arity="0"/> <fsummary>Current system profiling settings.</fsummary> <type name="system_profile_option"/> <desc> <p>Returns the current system profiling settings set by <seealso marker="#system_profile/2">erlang:system_profile/2</seealso> as <c>{<anno>ProfilerPid</anno>, <anno>Options</anno>}</c>, or <c>undefined</c> if there are no settings. The order of the options can be different from the one that was set.</p> </desc> </func> <func> <name name="system_profile" arity="2"/> <fsummary>Current system profiling settings.</fsummary> <type name="system_profile_option"/> <desc> <p>Sets system profiler options. <c><anno>ProfilerPid</anno></c> is a local process identifier (pid) or port receiving profiling messages. The receiver is excluded from all profiling. The second argument is a list of profiling options:</p> <taglist> <tag><c>exclusive</c></tag> <item> <p>If a synchronous call to a port from a process is done, the calling process is considered not runnable during the call runtime to the port. The calling process is notified as <c>inactive</c>, and later <c>active</c> when the port callback returns.</p> </item> <tag><c>monotonic_timestamp</c></tag> <item> <p>Timestamps in profile messages will use <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso>. The time-stamp (Ts) has the same format and value as produced by <c>erlang:monotonic_time(nano_seconds)</c>.</p> </item> <tag><c>runnable_procs</c></tag> <item> <p>If a process is put into or removed from the run queue, a message, <c>{profile, Pid, State, Mfa, Ts}</c>, is sent to <c><anno>ProfilerPid</anno></c>. Running processes that are reinserted into the run queue after having been preempted do not trigger this message.</p> </item> <tag><c>runnable_ports</c></tag> <item> <p>If a port is put into or removed from the run queue, a message, <c>{profile, Port, State, 0, Ts}</c>, is sent to <c><anno>ProfilerPid</anno></c>.</p> </item> <tag><c>scheduler</c></tag> <item> <p>If a scheduler is put to sleep or awoken, a message, <c>{profile, scheduler, Id, State, NoScheds, Ts}</c>, is sent to <c><anno>ProfilerPid</anno></c>.</p> </item> <tag><c>strict_monotonic_timestamp</c></tag> <item> <p>Timestamps in profile messages will consisting of <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> and a monotonically increasing integer. The time-stamp (Ts) has the same format and value as produced by <c>{erlang:monotonic_time(nano_seconds), erlang:unique_integer([monotonic])}</c>.</p> </item> <tag><c>timestamp</c></tag> <item> <p>Timestamps in profile messages will include a time-stamp (Ts) that has the same form as returned by <c>erlang:now()</c>. This is also the default if no timestamp flag is given. If <c>cpu_timestamp</c> has been enabled via <c>erlang:trace/3</c>, this will also effect the timestamp produced in profiling messages when <c>timestamp</c> flag is enabled.</p> </item> </taglist> <note><p><c>erlang:system_profile</c> is considered experimental and its behavior can change in a future release.</p> </note> </desc> </func> <func> <name name="system_time" arity="0"/> <fsummary>Current Erlang system time</fsummary> <desc> <p>Returns current <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso> in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso>.</p> <p>Calling <c>erlang:system_time()</c> is equivalent to: <seealso marker="#monotonic_time/0"><c>erlang:monotonic_time()</c></seealso><c> + </c><seealso marker="#time_offset/0"><c>erlang:time_offset()</c></seealso>.</p> <note><p>This time is <em>not</em> a monotonically increasing time in the general case. For more information, see the documentation of <seealso marker="time_correction#Time_Warp_Modes">time warp modes</seealso> in the ERTS User's Guide.</p></note> </desc> </func> <func> <name name="system_time" arity="1"/> <fsummary>Current Erlang system time</fsummary> <desc> <p>Returns current <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso> converted into the <c><anno>Unit</anno></c> passed as argument.</p> <p>Calling <c>erlang:system_time(<anno>Unit</anno>)</c> is equivalent to: <seealso marker="#convert_time_unit/3"><c>erlang:convert_time_unit</c></seealso><c>(</c><seealso marker="#system_time/0"><c>erlang:system_time()</c></seealso><c>, native, <anno>Unit</anno>)</c>.</p> <note><p>This time is <em>not</em> a monotonically increasing time in the general case. For more information, see the documentation of <seealso marker="time_correction#Time_Warp_Modes">time warp modes</seealso> in the ERTS User's Guide.</p></note> </desc> </func> <func> <name name="term_to_binary" arity="1"/> <fsummary>Encodes a term to an Erlang external term format binary.</fsummary> <desc> <p>Returns a binary data object that is the result of encoding <c><anno>Term</anno></c> according to the Erlang external term format.</p> <p>This can be used for various purposes, for example, writing a term to a file in an efficient way, or sending an Erlang term to some type of communications channel not supported by distributed Erlang.</p> <p>See also <seealso marker="#binary_to_term/1">binary_to_term/1</seealso>.</p> </desc> </func> <func> <name name="term_to_binary" arity="2"/> <fsummary>Encodes a term to en Erlang external term format binary.</fsummary> <desc> <p>Returns a binary data object that is the result of encoding <c><anno>Term</anno></c> according to the Erlang external term format.</p> <p>If option <c>compressed</c> is provided, the external term format is compressed. The compressed format is automatically recognized by <c>binary_to_term/1</c> as from Erlang R7B.</p> <p>A compression level can be specified by giving option <c>{compressed, <anno>Level</anno>}</c>. <c><anno>Level</anno></c> is an integer with range 0..9, where:</p> <list type="bulleted"> <item><c>0</c> - No compression is done (it is the same as giving no <c>compressed</c> option).</item> <item><c>1</c> - Takes least time but may not compress as well as the higher levels.</item> <item><c>6</c> - Default level when option <c>compressed</c> is provided.</item> <item><c>9</c> - Takes most time and tries to produce a smaller result. Notice "tries" in the preceding sentence; depending on the input term, level 9 compression either does or does not produce a smaller result than level 1 compression.</item> </list> <p>Option <c>{minor_version, <anno>Version</anno>}</c> can be used to control some encoding details. This option was introduced in OTP R11B-4. The valid values for <c><anno>Version</anno></c> are <c>0</c> and <c>1</c>.</p> <p>As from OTP 17.0, <c>{minor_version, 1}</c> is the default. It forces any floats in the term to be encoded in a more space-efficient and exact way (namely in the 64-bit IEEE format, rather than converted to a textual representation).</p> <p>As from OTP R11B-4, <c>binary_to_term/1</c> can decode this representation.</p> <p><c>{minor_version, 0}</c> means that floats are encoded using a textual representation. This option is useful to ensure that releases before OTP R11B-4 can decode resulting binary.</p> <p>See also <seealso marker="#binary_to_term/1">binary_to_term/1</seealso>.</p> </desc> </func> <func> <name name="throw" arity="1"/> <fsummary>Throws an exception.</fsummary> <desc> <p>A non-local return from a function. If evaluated within a <c>catch</c>, <c>catch</c> returns value <c><anno>Any</anno></c>.</p> <p>Example:</p> <pre> > <input>catch throw({hello, there}).</input> {hello,there}</pre> <p>Failure: <c>nocatch</c> if not evaluated within a catch.</p> </desc> </func> <func> <name name="time" arity="0"/> <fsummary>Current time.</fsummary> <desc> <p>Returns the current time as <c>{Hour, Minute, Second}</c>.</p> <p>The time zone and Daylight Saving Time correction depend on the underlying OS.</p> <p>Example:</p> <pre> > <input>time().</input> {9,42,44}</pre> </desc> </func> <func> <name name="time_offset" arity="0"/> <fsummary>Current time offset</fsummary> <desc> <p>Returns the current time offset between <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> and <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso> in <c>native</c> <seealso marker="#type_time_unit">time unit</seealso>. Current time offset added to an Erlang monotonic time gives corresponding Erlang system time.</p> <p>The time offset may or may not change during operation depending on the <seealso marker="time_correction#Time_Warp_Modes">time warp mode</seealso> used.</p> <note> <p>A change in time offset may be observed at slightly different points in time by different processes.</p> <p>If the runtime system is in <seealso marker="time_correction#Multi_Time_Warp_Mode">multi time warp mode</seealso>, the time offset will be changed when the runtime system detects that the <seealso marker="time_correction#OS_System_Time">OS system time</seealso> has changed. The runtime system will, however, not detect this immediately when it happens. A task checking the time offset is scheduled to execute at least once a minute, so under normal operation this should be detected within a minute, but during heavy load it might take longer time.</p> </note> </desc> </func> <func> <name name="time_offset" arity="1"/> <fsummary>Current time offset</fsummary> <desc> <p>Returns the current time offset between <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> and <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso> converted into the <c><anno>Unit</anno></c> passed as argument.</p> <p>Same as calling <seealso marker="#convert_time_unit/3"><c>erlang:convert_time_unit</c></seealso><c>(</c><seealso marker="#time_offset/0"><c>erlang:time_offset()</c></seealso><c>, native, <anno>Unit</anno>)</c> however optimized for commonly used <c><anno>Unit</anno></c>s.</p> </desc> </func> <func> <name name="timestamp" arity="0"/> <fsummary>Current Erlang System time</fsummary> <type name="timestamp"/> <desc> <p>Returns current <seealso marker="time_correction#Erlang_System_Time">Erlang system time</seealso> on the format <c>{MegaSecs, Secs, MicroSecs}</c>. This format is the same as <seealso marker="kernel:os#timestamp/0"><c>os:timestamp/0</c></seealso> and the deprecated <seealso marker="#now/0"><c>erlang:now/0</c></seealso> uses. The reason for the existence of <c>erlang:timestamp()</c> is purely to simplify usage for existing code that assumes this timestamp format. Current Erlang system time can more efficiently be retrieved in the time unit of your choice using <seealso marker="#system_time/1"><c>erlang:system_time/1</c></seealso>.</p> <p>The <c>erlang:timestamp()</c> BIF is equivalent to:</p><code type="none"> timestamp() -> ErlangSystemTime = erlang:system_time(micro_seconds), MegaSecs = ErlangSystemTime div 1000000000000, Secs = ErlangSystemTime div 1000000 - MegaSecs*1000000, MicroSecs = ErlangSystemTime rem 1000000, {MegaSecs, Secs, MicroSecs}.</code> <p>It, however, uses a native implementation which does not build garbage on the heap and with slightly better performance.</p> <note><p>This time is <em>not</em> a monotonically increasing time in the general case. For more information, see the documentation of <seealso marker="time_correction#Time_Warp_Modes">time warp modes</seealso> in the ERTS User's Guide.</p></note> </desc> </func> <func> <name name="tl" arity="1"/> <fsummary>Tail of a list.</fsummary> <desc> <p>Returns the tail of <c><anno>List</anno></c>, that is, the list minus the first element, for example:</p> <pre> > <input>tl([geesties, guilies, beasties]).</input> [guilies, beasties]</pre> <p>Allowed in guard tests.</p> <p>Failure: <c>badarg</c> if <c><anno>List</anno></c> is the empty list <c>[]</c>.</p> </desc> </func> <func> <name name="trace" arity="3"/> <fsummary>Sets trace flags for a process or processes.</fsummary> <type name="trace_flag"/> <desc> <p>Turns on (if <c><anno>How</anno> == true</c>) or off (if <c><anno>How</anno> == false</c>) the trace flags in <c><anno>FlagList</anno></c> for the process or processes represented by <c><anno>PidSpec</anno></c>.</p> <p><c><anno>PidSpec</anno></c> is either a process identifier (pid) for a local process, or one of the following atoms:</p> <taglist> <tag><c>existing</c></tag> <item> <p>All currently existing processes.</p> </item> <tag><c>new</c></tag> <item> <p>All processes that are created in the future.</p> </item> <tag><c>all</c></tag> <item> <p>All currently existing processes and all processes that are created in the future.</p> </item> </taglist> <p><c><anno>FlagList</anno></c> can contain any number of the following flags (the "message tags" refers to the list of <seealso marker="#trace_3_trace_messages">trace messages</seealso>):</p> <taglist> <tag><c>all</c></tag> <item> <p>Sets all trace flags except <c>{tracer, Tracer}</c> and <c>cpu_timestamp</c>, which are in their nature different than the others.</p> </item> <tag><c>send</c></tag> <item> <p>Traces sending of messages.</p> <p>Message tags: <c>send</c> and <c>send_to_non_existing_process</c>.</p> </item> <tag><c>'receive'</c></tag> <item> <p>Traces receiving of messages.</p> <p>Message tags: <c>'receive'</c>.</p> </item> <tag><c>procs</c></tag> <item> <p>Traces process-related events.</p> <p>Message tags: <c>spawn</c>, <c>exit</c>, <c>register</c>, <c>unregister</c>, <c>link</c>, <c>unlink</c>, <c>getting_linked</c>, and <c>getting_unlinked</c>.</p> </item> <tag><c>call</c></tag> <item> <p>Traces certain function calls. Specify which function calls to trace by calling <seealso marker="#trace_pattern/3">erlang:trace_pattern/3</seealso>.</p> <p>Message tags: <c>call</c> and <c>return_from</c>.</p> </item> <tag><c>silent</c></tag> <item> <p>Used with the <c>call</c> trace flag. The <c>call</c>, <c>return_from</c>, and <c>return_to</c> trace messages are inhibited if this flag is set, but they are executed as normal if there are match specifications.</p> <p>Silent mode is inhibited by executing <c>erlang:trace(_, false, [silent|_])</c>, or by a match specification executing the function <c>{silent, false}</c>.</p> <p>The <c>silent</c> trace flag facilitates setting up a trace on many or even all processes in the system. The trace can then be activated and deactivated using the match specification function <c>{silent,Bool}</c>, giving a high degree of control of which functions with which arguments that trigger the trace.</p> <p>Message tags: <c>call</c>, <c>return_from</c>, and <c>return_to</c>. Or rather, the absence of.</p> </item> <tag><c>return_to</c></tag> <item> <p>Used with the <c>call</c> trace flag. Traces the return from a traced function back to its caller. Only works for functions traced with option <c>local</c> to <seealso marker="#trace_pattern/3">erlang:trace_pattern/3</seealso>.</p> <p>The semantics is that a trace message is sent when a call traced function returns, that is, when a chain of tail recursive calls ends. Only one trace message is sent per chain of tail recursive calls, so the properties of tail recursiveness for function calls are kept while tracing with this flag. Using <c>call</c> and <c>return_to</c> trace together makes it possible to know exactly in which function a process executes at any time.</p> <p>To get trace messages containing return values from functions, use the <c>{return_trace}</c> match specification action instead.</p> <p>Message tags: <c>return_to</c>.</p> </item> <tag><c>running</c></tag> <item> <p>Traces scheduling of processes.</p> <p>Message tags: <c>in</c> and <c>out</c>.</p> </item> <tag><c>exiting</c></tag> <item> <p>Traces scheduling of exiting processes.</p> <p>Message tags: <c>in_exiting</c>, <c>out_exiting</c>, and <c>out_exited</c>.</p> </item> <tag><c>garbage_collection</c></tag> <item> <p>Traces garbage collections of processes.</p> <p>Message tags: <c>gc_start</c> and <c>gc_end</c>.</p> </item> <tag><c>timestamp</c></tag> <item> <p>Includes a time-stamp in all trace messages. The time-stamp (Ts) has the same form as returned by <c>erlang:now()</c>.</p> </item> <tag><c>cpu_timestamp</c></tag> <item> <p>A global trace flag for the Erlang node that makes all trace time-stamps using the <c>timestamp</c> flag to be in CPU time, not wall clock time. That is, <c>cpu_timestamp</c> will not be used if <c>monotonic_timestamp</c>, or <c>strict_monotonic_timestamp</c> is enabled. Only allowed with <c>PidSpec==all</c>. If the host machine OS does not support high-resolution CPU time measurements, <c>trace/3</c> exits with <c>badarg</c>. Notice that most OS do not synchronize this value across cores, so be prepared that time might seem to go backwards when using this option.</p> </item> <tag><c>monotonic_timestamp</c></tag> <item> <p>Includes an <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> time-stamp in all trace messages. The time-stamp (Ts) has the same format and value as produced by <c>erlang:monotonic_time(nano_seconds)</c>. This flag overrides the <c>cpu_timestamp</c> flag.</p> </item> <tag><c>strict_monotonic_timestamp</c></tag> <item> <p>Includes an timestamp consisting of <seealso marker="time_correction#Erlang_Monotonic_Time">Erlang monotonic time</seealso> and a monotonically increasing integer in all trace messages. The time-stamp (Ts) has the same format and value as produced by <c>{erlang:monotonic_time(nano_seconds), erlang:unique_integer([monotonic])}</c>. This flag overrides the <c>cpu_timestamp</c> flag.</p> </item> <tag><c>arity</c></tag> <item> <p>Used with the <c>call</c> trace flag. <c>{M, F, Arity}</c> is specified instead of <c>{M, F, Args}</c> in call trace messages.</p> </item> <tag><c>set_on_spawn</c></tag> <item> <p>Makes any process created by a traced process inherit its trace flags, including flag <c>set_on_spawn</c>.</p> </item> <tag><c>set_on_first_spawn</c></tag> <item> <p>Makes the first process created by a traced process inherit its trace flags, excluding flag <c>set_on_first_spawn</c>.</p> </item> <tag><c>set_on_link</c></tag> <item> <p>Makes any process linked by a traced process inherit its trace flags, including flag <c>set_on_link</c>.</p> </item> <tag><c>set_on_first_link</c></tag> <item> <p>Makes the first process linked to by a traced process inherit its trace flags, excluding flag <c>set_on_first_link</c>.</p> </item> <tag><c>{tracer, Tracer}</c></tag> <item> <p>Specifies where to send the trace messages. <c>Tracer</c> must be the process identifier of a local process or the port identifier of a local port. If this flag is not given, trace messages are sent to the process that called <c>erlang:trace/3</c>.</p> </item> </taglist> <p>The effect of combining <c>set_on_first_link</c> with <c>set_on_link</c> is the same as having <c>set_on_first_link</c> alone. Likewise for <c>set_on_spawn</c> and <c>set_on_first_spawn</c>.</p> <p>The tracing process receives the <em>trace messages</em> described in the following list. <c>Pid</c> is the process identifier of the traced process in which the traced event has occurred. The third tuple element is the message tag.</p> <p>If flag <c>timestamp</c>, <c>strict_monotonic_timestamp</c>, or <c>monotonic_timestamp</c> is given, the first tuple element is <c>trace_ts</c> instead, and the time-stamp is added as an extra element last in the message tuple. If multiple timestamp flags are passed, <c>timestamp</c> has precedence over <c>strict_monotonic_timestamp</c> which in turn has precedence over <c>monotonic_timestamp</c>. All timestamp flags are remembered, so if two are passed and the one with highest precedence later is disabled the other one will become active.</p> <marker id="trace_3_trace_messages"></marker> <taglist> <tag><c>{trace, Pid, 'receive', Msg}</c></tag> <item> <p>When <c>Pid</c> receives message <c>Msg</c>.</p> </item> <tag><c>{trace, Pid, send, Msg, To}</c></tag> <item> <p>When <c>Pid</c> sends message <c>Msg</c> to process <c>To</c>.</p> </item> <tag><c>{trace, Pid, send_to_non_existing_process, Msg, To}</c></tag> <item> <p>When <c>Pid</c> sends message <c>Msg</c> to the non-existing process <c>To</c>.</p> </item> <tag><c>{trace, Pid, call, {M, F, Args}}</c></tag> <item> <p>When <c>Pid</c> calls a traced function. The return values of calls are never supplied, only the call and its arguments.</p> <p>Trace flag <c>arity</c> can be used to change the contents of this message, so that <c>Arity</c> is specified instead of <c>Args</c>.</p> </item> <tag><c>{trace, Pid, return_to, {M, F, Arity}}</c></tag> <item> <p>When <c>Pid</c> returns <em>to</em> the specified function. This trace message is sent if both the flags <c>call</c> and <c>return_to</c> are set, and the function is set to be traced on <em>local</em> function calls. The message is only sent when returning from a chain of tail recursive function calls, where at least one call generated a <c>call</c> trace message (that is, the functions match specification matched, and <c>{message, false}</c> was not an action).</p> </item> <tag><c>{trace, Pid, return_from, {M, F, Arity}, ReturnValue}</c></tag> <item> <p>When <c>Pid</c> returns <em>from</em> the specified function. This trace message is sent if flag <c>call</c> is set, and the function has a match specification with a <c>return_trace</c> or <c>exception_trace</c> action.</p> </item> <tag><c>{trace, Pid, exception_from, {M, F, Arity}, {Class, Value}}</c></tag> <item> <p>When <c>Pid</c> exits <em>from</em> the specified function because of an exception. This trace message is sent if flag <c>call</c> is set, and the function has a match specification with an <c>exception_trace</c> action.</p> </item> <tag><c>{trace, Pid, spawn, Pid2, {M, F, Args}}</c></tag> <item> <p>When <c>Pid</c> spawns a new process <c>Pid2</c> with the specified function call as entry point.</p> <p><c>Args</c> is supposed to be the argument list, but can be any term if the spawn is erroneous.</p> </item> <tag><c>{trace, Pid, exit, Reason}</c></tag> <item> <p>When <c>Pid</c> exits with reason <c>Reason</c>.</p> </item> <tag><c>{trace, Pid, link, Pid2}</c></tag> <item> <p>When <c>Pid</c> links to a process <c>Pid2</c>.</p> </item> <tag><c>{trace, Pid, unlink, Pid2}</c></tag> <item> <p>When <c>Pid</c> removes the link from a process <c>Pid2</c>.</p> </item> <tag><c>{trace, Pid, getting_linked, Pid2}</c></tag> <item> <p>When <c>Pid</c> gets linked to a process <c>Pid2</c>.</p> </item> <tag><c>{trace, Pid, getting_unlinked, Pid2}</c></tag> <item> <p>When <c>Pid</c> gets unlinked from a process <c>Pid2</c>.</p> </item> <tag><c>{trace, Pid, register, RegName}</c></tag> <item> <p>When <c>Pid</c> gets the name <c>RegName</c> registered.</p> </item> <tag><c>{trace, Pid, unregister, RegName}</c></tag> <item> <p>When <c>Pid</c> gets the name <c>RegName</c> unregistered. This is done automatically when a registered process exits.</p> </item> <tag><c>{trace, Pid, in, {M, F, Arity} | 0}</c></tag> <item> <p>When <c>Pid</c> is scheduled to run. The process runs in function <c>{M, F, Arity}</c>. On some rare occasions, the current function cannot be determined, then the last element is <c>0</c>.</p> </item> <tag><c>{trace, Pid, out, {M, F, Arity} | 0}</c></tag> <item> <p>When <c>Pid</c> is scheduled out. The process was running in function {M, F, Arity}. On some rare occasions, the current function cannot be determined, then the last element is <c>0</c>.</p> </item> <tag><c>{trace, Pid, gc_start, Info}</c></tag> <item> <marker id="gc_start"></marker> <p>Sent when garbage collection is about to be started. <c>Info</c> is a list of two-element tuples, where the first element is a key, and the second is the value. Do not depend on any order of the tuples. The following keys are defined:</p> <taglist> <tag><c>heap_size</c></tag> <item>The size of the used part of the heap.</item> <tag><c>heap_block_size</c></tag> <item>The size of the memory block used for storing the heap and the stack.</item> <tag><c>old_heap_size</c></tag> <item>The size of the used part of the old heap.</item> <tag><c>old_heap_block_size</c></tag> <item>The size of the memory block used for storing the old heap.</item> <tag><c>stack_size</c></tag> <item>The size of the stack.</item> <tag><c>recent_size</c></tag> <item>The size of the data that survived the previous garbage collection.</item> <tag><c>mbuf_size</c></tag> <item>The combined size of message buffers associated with the process.</item> <tag><c>bin_vheap_size</c></tag> <item>The total size of unique off-heap binaries referenced from the process heap.</item> <tag><c>bin_vheap_block_size</c></tag> <item>The total size of binaries allowed in the virtual heap in the process before doing a garbage collection.</item> <tag><c>bin_old_vheap_size</c></tag> <item>The total size of unique off-heap binaries referenced from the process old heap.</item> <tag><c>bin_old_vheap_block_size</c></tag> <item>The total size of binaries allowed in the virtual old heap in the process before doing a garbage collection.</item> </taglist> <p>All sizes are in words.</p> </item> <tag><c>{trace, Pid, gc_end, Info}</c></tag> <item> <p>Sent when garbage collection is finished. <c>Info</c> contains the same kind of list as in message <c>gc_start</c>, but the sizes reflect the new sizes after garbage collection.</p> </item> </taglist> <p>If the tracing process dies, the flags are silently removed.</p> <p>Only one process can trace a particular process. Therefore, attempts to trace an already traced process fail.</p> <p>Returns: A number indicating the number of processes that matched <c><anno>PidSpec</anno></c>. If <c><anno>PidSpec</anno></c> is a process identifier, the return value is <c>1</c>. If <c><anno>PidSpec</anno></c> is <c>all</c> or <c>existing</c>, the return value is the number of processes running, excluding tracer processes. If <c><anno>PidSpec</anno></c> is <c>new</c>, the return value is <c>0</c>.</p> <p>Failure: <c>badarg</c> if the specified arguments are not supported. For example, <c>cpu_timestamp</c> is not supported on all platforms.</p> </desc> </func> <func> <name name="trace_delivered" arity="1"/> <fsummary>Notification when trace has been delivered.</fsummary> <desc> <p>The delivery of trace messages is dislocated on the time-line compared to other events in the system. If you know that <c><anno>Tracee</anno></c> has passed some specific point in its execution, and you want to know when at least all trace messages corresponding to events up to this point have reached the tracer, use <c>erlang:trace_delivered(<anno>Tracee</anno>)</c>. A <c>{trace_delivered, <anno>Tracee</anno>, <anno>Ref</anno>}</c> message is sent to the caller of <c>erlang:trace_delivered(<anno>Tracee</anno>)</c> when it is guaranteed that all trace messages are delivered to the tracer up to the point that <c><anno>Tracee</anno></c> reached at the time of the call to <c>erlang:trace_delivered(<anno>Tracee</anno>)</c>.</p> <p>Notice that message <c>trace_delivered</c> does <em>not</em> imply that trace messages have been delivered. Instead it implies that all trace messages that <em>are to be delivered</em> have been delivered. It is not an error if <c><anno>Tracee</anno></c> is not, and has not been traced by someone, but if this is the case, <em>no</em> trace messages have been delivered when the <c>trace_delivered</c> message arrives.</p> <p>Notice that that <c><anno>Tracee</anno></c> must refer to a process currently, or previously existing on the same node as the caller of <c>erlang:trace_delivered(<anno>Tracee</anno>)</c> resides on. The special <c><anno>Tracee</anno></c> atom <c>all</c> denotes all processes that currently are traced in the node.</p> <p>Example: Process <c>A</c> is <c><anno>Tracee</anno></c>, port <c>B</c> is tracer, and process <c>C</c> is the port owner of <c>B</c>. <c>C</c> wants to close <c>B</c> when <c>A</c> exits. To ensure that the trace is not truncated, <c>C</c> can call <c>erlang:trace_delivered(A)</c>, when <c>A</c> exits, and wait for message <c>{trace_delivered, A, <anno>Ref</anno>}</c> before closing <c>B</c>.</p> <p>Failure: <c>badarg</c> if <c><anno>Tracee</anno></c> does not refer to a process (dead or alive) on the same node as the caller of <c>erlang:trace_delivered(<anno>Tracee</anno>)</c> resides on.</p> </desc> </func> <func> <name name="trace_info" arity="2"/> <fsummary>Trace information about a process or function.</fsummary> <type name="trace_info_return"/> <type name="trace_info_item_result"/> <type name="trace_info_flag"/> <type name="trace_match_spec"/> <desc> <p>Returns trace information about a process or function.</p> <p>To get information about a process, <c><anno>PidOrFunc</anno></c> is to be a process identifier (pid) or the atom <c>new</c>. The atom <c>new</c> means that the default trace state for processes to be created is returned.</p> <p>The following <c>Item</c>s are valid:</p> <taglist> <tag><c>flags</c></tag> <item> <p>Returns a list of atoms indicating what kind of traces is enabled for the process. The list is empty if no traces are enabled, and one or more of the followings atoms if traces are enabled: <c>send</c>, <c>'receive'</c>, <c>set_on_spawn</c>, <c>call</c>, <c>return_to</c>, <c>procs</c>, <c>set_on_first_spawn</c>, <c>set_on_link</c>, <c>running</c>, <c>garbage_collection</c>, <c>timestamp</c>, and <c>arity</c>. The order is arbitrary.</p> </item> <tag><c>tracer</c></tag> <item> <p>Returns the identifier for process or port tracing this process. If this process is not being traced, the return value is <c>[]</c>.</p> </item> </taglist> <p>To get information about a function, <c>PidOrFunc</c> is to be the three-element tuple <c>{Module, Function, Arity}</c> or the atom <c>on_load</c>. No wild cards are allowed. Returns <c>undefined</c> if the function does not exist, or <c>false</c> if the function is not traced.</p> <p>The following <c>Item</c>s are valid::</p> <taglist> <tag><c>traced</c></tag> <item> <p>Returns <c>global</c> if this function is traced on global function calls, <c>local</c> if this function is traced on local function calls (that is, local and global function calls), and <c>false</c> if local or global function calls are not traced.</p> </item> <tag><c>match_spec</c></tag> <item> <p>Returns the match specification for this function, if it has one. If the function is locally or globally traced but has no match specification defined, the returned value is <c>[]</c>.</p> </item> <tag><c>meta</c></tag> <item> <p>Returns the meta-trace tracer process or port for this function, if it has one. If the function is not meta-traced, the returned value is <c>false</c>. If the function is meta-traced but has once detected that the tracer process is invalid, the returned value is [].</p> </item> <tag><c>meta_match_spec</c></tag> <item> <p>Returns the meta-trace match specification for this function, if it has one. If the function is meta-traced but has no match specification defined, the returned value is <c>[]</c>.</p> </item> <tag><c>call_count</c></tag> <item> <p>Returns the call count value for this function or <c>true</c> for the pseudo function <c>on_load</c> if call count tracing is active. Otherwise <c>false</c> is returned. See also <seealso marker="#trace_pattern/3">erlang:trace_pattern/3</seealso>.</p> </item> <tag><c>call_time</c></tag> <item> <p>Returns the call time values for this function or <c>true</c> for the pseudo function <c>on_load</c> if call time tracing is active. Otherwise <c>false</c> is returned. The call time values returned, <c>[{Pid, Count, S, Us}]</c>, is a list of each process that executed the function and its specific counters. See also <seealso marker="#trace_pattern/3">erlang:trace_pattern/3</seealso>.</p> </item> <tag><c>all</c></tag> <item> <p>Returns a list containing the <c>{<anno>Item</anno>, Value}</c> tuples for all other items, or returns <c>false</c> if no tracing is active for this function.</p> </item> </taglist> <p>The return value is <c>{<anno>Item</anno>, Value}</c>, where <c>Value</c> is the requested information as described earlier. If a pid for a dead process was given, or the name of a non-existing function, <c>Value</c> is <c>undefined</c>.</p> <p>If <c><anno>PidOrFunc</anno></c> is <c>on_load</c>, the information returned refers to the default value for code that will be loaded.</p> </desc> </func> <func> <name name="trace_pattern" arity="2" clause_i="1"/> <fsummary>Sets trace patterns for global call tracing.</fsummary> <type name="trace_pattern_mfa"/> <type name="trace_match_spec"/> <desc> <p>The same as <seealso marker="#trace_pattern/3">erlang:trace_pattern(MFA, MatchSpec, [])</seealso>, retained for backward compatibility.</p> </desc> </func> <func> <name name="trace_pattern" arity="3"/> <fsummary>Sets trace patterns for tracing of function calls.</fsummary> <type name="trace_pattern_mfa"/> <type name="trace_match_spec"/> <type name="trace_pattern_flag"/> <desc> <p>Enables or disables call tracing for one or more functions. Must be combined with <seealso marker="#trace/3">erlang:trace/3</seealso> to set the <c>call</c> trace flag for one or more processes.</p> <p>Conceptually, call tracing works as follows. Inside the Erlang Virtual Machine, a set of processes and a set of functions are to be traced. If a traced process calls a traced function, the trace action is taken. Otherwise, nothing happens.</p> <p>To add or remove one or more processes to the set of traced processes, use <seealso marker="#trace/3">erlang:trace/3</seealso>.</p> <p>To add or remove functions to the set of traced functions, use <c>erlang:trace_pattern/3</c>.</p> <p>The BIF <c>erlang:trace_pattern/3</c> can also add match specifications to a function. A match specification comprises a pattern that the function arguments must match, a guard expression that must evaluate to <c>true</c>, and an action to be performed. The default action is to send a trace message. If the pattern does not match or the guard fails, the action is not executed.</p> <p>Argument <c><anno>MFA</anno></c> is to be a tuple, such as <c>{Module, Function, Arity}</c>, or the atom <c>on_load</c> (described in the following). It can be the module, function, and arity for a function (or a BIF in any module). The atom <c>'_'</c> can be used as a wild card in any of the following ways:</p> <taglist> <tag><c>{Module,Function,'_'}</c></tag> <item> <p>All functions of any arity named <c>Function</c> in module <c>Module</c>.</p> </item> <tag><c>{Module,'_','_'}</c></tag> <item> <p>All functions in module <c>Module</c>.</p> </item> <tag><c>{'_','_','_'}</c></tag> <item> <p>All functions in all loaded modules.</p> </item> </taglist> <p>Other combinations, such as <c>{Module,'_',Arity}</c>, are not allowed. Local functions match wild cards only if option <c>local</c> is in <c><anno>FlagList</anno></c>.</p> <p>If argument <c><anno>MFA</anno></c> is the atom <c>on_load</c>, the match specification and flag list are used on all modules that are newly loaded.</p> <p>Argument <c><anno>MatchSpec</anno></c> can take the following forms:</p> <taglist> <tag><c>false</c></tag> <item> <p>Disables tracing for the matching functions. Any match specification is removed.</p> </item> <tag><c>true</c></tag> <item> <p>Enables tracing for the matching functions.</p> </item> <tag><c><anno>MatchSpecList</anno></c></tag> <item> <p>A list of match specifications. An empty list is equivalent to <c>true</c>. For a description of match specifications, see the User's Guide.</p> </item> <tag><c>restart</c></tag> <item> <p>For the <c><anno>FlagList</anno></c> options <c>call_count</c> and <c>call_time</c>: restarts the existing counters. The behavior is undefined for other <c><anno>FlagList</anno></c> options.</p> </item> <tag><c>pause</c></tag> <item> <p>For the <c><anno>FlagList</anno></c> options <c>call_count</c> and <c>call_time</c>: pauses the existing counters. The behavior is undefined for other <c><anno>FlagList</anno></c> options.</p> </item> </taglist> <p>Parameter <c><anno>FlagList</anno></c> is a list of options. The following are the valid options:</p> <taglist> <tag><c>global</c></tag> <item> <p>Turns on or off call tracing for global function calls (that is, calls specifying the module explicitly). Only exported functions match and only global calls generate trace messages. <em>This is the default</em>.</p> </item> <tag><c>local</c></tag> <item> <p>Turns on or off call tracing for all types of function calls. Trace messages are sent whenever any of the specified functions are called, regardless of how they are called. If flag <c>return_to</c> is set for the process, a <c>return_to</c> message is also sent when this function returns to its caller.</p> </item> <tag><c>meta | {meta, <anno>Pid</anno>}</c></tag> <item> <p>Turns on or off meta-tracing for all types of function calls. Trace messages are sent to the tracer process or port <c><anno>Pid</anno></c> whenever any of the specified functions are called, regardless of how they are called. If no <c><anno>Pid</anno></c> is specified, <c>self()</c> is used as a default tracer process.</p> <p>Meta-tracing traces all processes and does not care about the process trace flags set by <c>trace/3</c>, the trace flags are instead fixed to <c>[call, timestamp]</c>.</p> <p>The match specification function <c>{return_trace}</c> works with meta-trace and sends its trace message to the same tracer process.</p> </item> <tag><c>call_count</c></tag> <item> <p>Starts (<c><anno>MatchSpec</anno> == true</c>) or stops (<c><anno>MatchSpec</anno> == false</c>) call count tracing for all types of function calls. For every function, a counter is incremented when the function is called, in any process. No process trace flags need to be activated.</p> <p>If call count tracing is started while already running, the count is restarted from zero. To pause running counters, use <c><anno>MatchSpec</anno> == pause</c>. Paused and running counters can be restarted from zero with <c><anno>MatchSpec</anno> == restart</c>.</p> <p>To read the counter value, use <seealso marker="#trace_info/2">erlang:trace_info/2</seealso>.</p> </item> <tag><c>call_time</c></tag> <item> <p>Starts (<c><anno>MatchSpec</anno> == true</c>) or stops (<c><anno>MatchSpec</anno> == false</c>) call time tracing for all types of function calls. For every function, a counter is incremented when the function is called. Time spent in the function is accumulated in two other counters, seconds and microseconds. The counters are stored for each call traced process.</p> <p>If call time tracing is started while already running, the count and time is restarted from zero. To pause running counters, use <c><anno>MatchSpec</anno> == pause</c>. Paused and running counters can be restarted from zero with <c><anno>MatchSpec</anno> == restart</c>.</p> <p>To read the counter value, use <seealso marker="#trace_info/2">erlang:trace_info/2</seealso>.</p> </item> </taglist> <p>The options <c>global</c> and <c>local</c> are mutually exclusive, and <c>global</c> is the default (if no options are specified). The options <c>call_count</c> and <c>meta</c> perform a kind of local tracing, and cannot be combined with <c>global</c>. A function can be globally or locally traced. If global tracing is specified for a set of functions, then local, meta, call time, and call count tracing for the matching set of local functions is disabled, and conversely.</p> <p>When disabling trace, the option must match the type of trace set on the function. That is, local tracing must be disabled with option <c>local</c> and global tracing with option <c>global</c> (or no option), and so forth.</p> <p>Part of a match specification list cannot be changed directly. If a function has a match specification, it can be replaced with a new one. To change an existing match specification, use the BIF <seealso marker="#trace_info/2">erlang:trace_info/2</seealso> to retrieve the existing match specification.</p> <p>Returns the number of functions matching argument <c><anno>MFA</anno></c>. This is zero if none matched.</p> </desc> </func> <func> <name name="trunc" arity="1"/> <fsummary>Returns an integer by truncating a number</fsummary> <desc> <p>Returns an integer by truncating <c><anno>Number</anno></c>, for example:</p> <pre> > <input>trunc(5.5).</input> 5</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="tuple_size" arity="1"/> <fsummary>Returns the size of a tuple.</fsummary> <desc> <p>Returns an integer that is the number of elements in <c><anno>Tuple</anno></c>, for example:</p> <pre> > <input>tuple_size({morni, mulle, bwange}).</input> 3</pre> <p>Allowed in guard tests.</p> </desc> </func> <func> <name name="tuple_to_list" arity="1"/> <fsummary>Converts a tuple to a list.</fsummary> <desc> <p>Returns a list corresponding to <c><anno>Tuple</anno></c>. <c><anno>Tuple</anno></c> can contain any Erlang terms.</p> <p>Example:</p> <pre> > <input>tuple_to_list({share, {'Ericsson_B', 163}}).</input> [share,{'Ericsson_B',163}]</pre> </desc> </func> <func> <name name="universaltime" arity="0"/> <fsummary>Current date and time according to Universal Time Coordinated (UTC).</fsummary> <desc> <p>Returns the current date and time according to Universal Time Coordinated (UTC) in the form <c>{{Year, Month, Day}, {Hour, Minute, Second}}</c> if supported by the underlying OS. Otherwise <c>erlang:universaltime()</c> is equivalent to <c>erlang:localtime()</c>.</p> <p>Example:</p> <pre> > <input>erlang:universaltime().</input> {{1996,11,6},{14,18,43}}</pre> </desc> </func> <func> <name name="universaltime_to_localtime" arity="1"/> <fsummary>Converts from Universal Time Coordinated (UTC) to local date and time.</fsummary> <desc> <p>Converts Universal Time Coordinated (UTC) date and time to local date and time in the form <c>{{Year, Month, Day}, {Hour, Minute, Second}}</c> if supported by the underlying OS. Otherwise no conversion is done, and <c><anno>Universaltime</anno></c> is returned.</p> <p>Example:</p> <pre> > <input>erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).</input> {{1996,11,7},{15,18,43}}</pre> <p>Failure: <c>badarg</c> if <c>Universaltime</c> denotes an invalid date and time.</p> </desc> </func> <func> <name name="unique_integer" arity="0"/> <fsummary>Get a unique integer value</fsummary> <desc> <p>Generates and returns an <seealso marker="doc/efficiency_guide:advanced#unique_integers">integer unique on current runtime system instance</seealso>. The same as calling <seealso marker="#unique_integer/1"><c>erlang:unique_integer([])</c></seealso>.</p> </desc> </func> <func> <name name="unique_integer" arity="1"/> <fsummary>Get a unique integer value</fsummary> <desc> <p>Generates and returns an <seealso marker="doc/efficiency_guide:advanced#unique_integers">integer unique on current runtime system instance</seealso>. The integer is unique in the sense that this BIF, using the same set of modifiers, will not return the same integer more than once on the current runtime system instance. Each integer value can of course be constructed by other means.</p> <p>By default, when <c>[]</c> is passed as <c><anno>ModifierList</anno></c>, both negative and positive integers can be returned. This in order to utilize the range of integers that do not need heap memory allocation as much as possible. By default the returned integers are also only guaranteed to be unique, that is, any returned integer can be smaller or larger than previously returned integers.</p> <p>Valid <c><anno>Modifier</anno></c>s:</p> <taglist> <tag>positive</tag> <item><p>Return only positive integers.</p> <p>Note that by passing the <c>positive</c> modifier you will get heap allocated integers (bignums) quicker.</p> </item> <tag>monotonic</tag> <item><p>Return <seealso marker="time_correction#Strictly_Monotonically_Increasing">strictly monotonically increasing</seealso> integers corresponding to creation time. That is, the integer returned will always be larger than previously returned integers on the current runtime system instance.</p> <p>These values can be used to determine order between events on the runtime system instance. That is, if both <c>X = erlang:unique_integer([monotonic])</c> and <c>Y = erlang:unique_integer([monotonic])</c> are executed by different processes (or the same process) on the same runtime system instance and <c>X < Y</c> we know that <c>X</c> was created before <c>Y</c>.</p> <warning><p>Strictly monotonically increasing values are inherently quite expensive to generate and scales poorly. This is because the values need to be synchronized between cpu cores. That is, do not pass the <c>monotonic</c> modifier unless you really need strictly monotonically increasing values.</p></warning> </item> </taglist> <p>All valid <c><anno>Modifier</anno></c>s can be combined. Repeated (valid) <c><anno>Modifier</anno></c>s in the <c>ModifierList</c> are ignored.</p> <note><p>Note that the set of integers returned by <c>unique_integer/1</c> using different sets of <c><anno>Modifier</anno></c>s <em>will overlap</em>. For example, by calling <c>unique_integer([monotonic])</c>, and <c>unique_integer([positive, monotonic])</c> repeatedly, you will eventually see some integers being returned by both calls.</p></note> <p>Failures:</p> <taglist> <tag><c>badarg</c></tag> <item>if <c><anno>ModifierList</anno></c> is not a proper list.</item> <tag><c>badarg</c></tag> <item>if <c><anno>Modifier</anno></c> is not a valid modifier.</item> </taglist> </desc> </func> <func> <name name="unlink" arity="1"/> <fsummary>Removes a link to another process or port.</fsummary> <desc> <p>Removes the link, if there is one, between the calling process and the process or port referred to by <c><anno>Id</anno></c>.</p> <p>Returns <c>true</c> and does not fail, even if there is no link to <c><anno>Id</anno></c>, or if <c><anno>Id</anno></c> does not exist.</p> <p>Once <c>unlink(<anno>Id</anno>)</c> has returned, it is guaranteed that the link between the caller and the entity referred to by <c><anno>Id</anno></c> has no effect on the caller in the future (unless the link is setup again). If the caller is trapping exits, an <c>{'EXIT', <anno>Id</anno>, _}</c> message from the link can have been placed in the caller's message queue before the call.</p> <p>Notice that the <c>{'EXIT', <anno>Id</anno>, _}</c> message can be the result of the link, but can also be the result of <c>Id</c> calling <c>exit/2</c>. Therefore, it <em>can</em> be appropriate to clean up the message queue when trapping exits after the call to <c>unlink(<anno>Id</anno>)</c>, as follows:</p> <code type="none"> unlink(Id), receive {'EXIT', Id, _} -> true after 0 -> true end</code> <note> <p>Prior to OTP release R11B (ERTS version 5.5) <c>unlink/1</c> behaved completely asynchronously, i.e., the link was active until the "unlink signal" reached the linked entity. This had an undesirable effect, as you could never know when you were guaranteed <em>not</em> to be effected by the link.</p> <p>The current behavior can be viewed as two combined operations: asynchronously send an "unlink signal" to the linked entity and ignore any future results of the link.</p> </note> </desc> </func> <func> <name name="unregister" arity="1"/> <fsummary>Removes the registered name for a process (or port).</fsummary> <desc> <p>Removes the registered name <c><anno>RegName</anno></c> associated with a process identifier or a port identifier, for example:</p> <pre> > <input>unregister(db).</input> true</pre> <p>Users are advised not to unregister system processes.</p> <p>Failure: <c>badarg</c> if <c>RegName</c> is not a registered name.</p> </desc> </func> <func> <name name="whereis" arity="1"/> <fsummary>Gets the pid (or port) with a given registered name.</fsummary> <desc> <p>Returns the process identifier or port identifier with the registered name <c>RegName</c>. Returns <c>undefined</c> if the name is not registered.</p> <p>Example:</p> <pre> > <input>whereis(db).</input> <0.43.0></pre> </desc> </func> <func> <name name="yield" arity="0"/> <fsummary>Lets other processes get a chance to execute.</fsummary> <desc> <p>Voluntarily lets other processes (if any) get a chance to execute. Using <c>erlang:yield()</c> is similar to <c>receive after 1 -> ok end</c>, except that <c>yield()</c> is faster.</p> <warning><p>There is seldom or never any need to use this BIF, especially in the SMP emulator, as other processes have a chance to run in another scheduler thread anyway. Using this BIF without a thorough grasp of how the scheduler works can cause performance degradation.</p></warning> </desc> </func> </funcs> </erlref>