diff options
Diffstat (limited to 'lib/kernel/doc/src/erpc.xml')
-rw-r--r-- | lib/kernel/doc/src/erpc.xml | 705 |
1 files changed, 587 insertions, 118 deletions
diff --git a/lib/kernel/doc/src/erpc.xml b/lib/kernel/doc/src/erpc.xml index 26d1ec4aad..876a8a66b6 100644 --- a/lib/kernel/doc/src/erpc.xml +++ b/lib/kernel/doc/src/erpc.xml @@ -4,7 +4,7 @@ <erlref> <header> <copyright> - <year>2020</year><year>2021</year> + <year>2020</year><year>2022</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -64,12 +64,55 @@ <name name="request_id"/> <desc> <p> - An opaque type of call request identifiers. For more - information see + An opaque request identifier. For more information see <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>. </p> </desc> </datatype> + <datatype> + <name name="request_id_collection"/> + <desc> + <p> + An opaque collection of request identifiers + (<seetype marker="#request_id"><c>request_id()</c></seetype>) + where each request identifier can be associated with a label + chosen by the user. For more information see + <seemfa marker="#reqids_new/0"><c>reqids_new/0</c></seemfa>. + </p> + </desc> + </datatype> + <datatype> + <name name="timeout_time"/> + <desc> + <taglist> + <tag><c>0..4294967295</c></tag> + <item><p> + Timeout relative to current time in milliseconds. + </p></item> + <tag><c>infinity</c></tag> + <item><p> + Infinite timeout. That is, the operation will never time out. + </p></item> + <tag><c>{abs, Timeout}</c></tag> + <item><p> + An absolute + <seemfa marker="erts:erlang#monotonic_time/1">Erlang monotonic time</seemfa> + timeout in milliseconds. That is, the operation will time out when + <seemfa marker="erts:erlang#monotonic_time/1"><c>erlang:monotonic_time(millisecond)</c></seemfa> + returns a value larger than or equal to <c>Timeout</c>. <c>Timeout</c> + is not allowed to identify a time further into the future than <c>4294967295</c> + milliseconds. Identifying the timeout using an absolute timeout value + is especially handy when you have a deadline for responses corresponding + to a complete collection of requests + (<seetype marker="#request_id_collection"><c>request_id_collection()</c></seetype>) +, + since you do not have to recalculate the relative time until the deadline + over and over again. + </p></item> + </taglist> + </desc> + </datatype> + </datatypes> <funcs> @@ -81,8 +124,9 @@ <desc> <p> The same as calling - <seemfa marker="#call/5"><c>erpc:call(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]],<anno>Timeout</anno>)</c></seemfa>. - May raise all the same exceptions as <c>erpc:call/5</c> + <seemfa marker="#call/5"><c>erpc:call(<anno>Node</anno>, + erlang, apply, [<anno>Fun</anno>,[]], <anno>Timeout</anno>)</c></seemfa>. + May raise all the same exceptions as <c>call/5</c> plus an <c>{erpc, badarg}</c> <c>error</c> exception if <c><anno>Fun</anno></c> is not a fun of zero arity. @@ -104,9 +148,8 @@ Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> on node <c><anno>Node</anno></c> and returns the corresponding value <c><anno>Result</anno></c>. - <c><anno>Timeout</anno></c> is an integer representing - the timeout in milliseconds or the atom <c>infinity</c> - which prevents the operation from ever timing out. + <c><anno>Timeout</anno></c> sets an upper time limit + for the <c>call</c> operation to complete. </p> <p>The call <c>erpc:call(<anno>Node</anno>, <anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> is equivalent @@ -118,7 +161,7 @@ exceptions, the operation did not time out, and no failures occurred. In all other cases an exception is raised. The following exceptions, listed by exception class, can - currently be raised by <c>erpc:call()</c>: + currently be raised by <c>call()</c>: </p> <taglist> <tag><c>throw</c></tag> @@ -158,7 +201,7 @@ <tag><c>{exception, ErrorReason, StackTrace}</c></tag> <item><p> - A runtime error occurred which raised and error + A runtime error occurred which raised an error exception while applying the function, and the applied function did not catch the exception. The error reason <c>ErrorReason</c> @@ -186,9 +229,8 @@ <item><p><c><anno>Args</anno></c> is not a list. Note that the list is not verified to be a proper list at the client side.</p></item> - <item><p><c><anno>Timeout</anno></c> is not the - atom <c>infinity</c> or an integer in valid - range.</p></item> + <item><p><c><anno>Timeout</anno></c> is + invalid.</p></item> </list> </item> @@ -256,7 +298,7 @@ The same as calling <seemfa marker="#cast/4"><c>erpc:cast(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>. </p> - <p><c>erpc:cast/2</c> fails with an <c>{erpc, badarg}</c> + <p><c>cast/2</c> fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Node</anno></c> is not an atom.</p></item> @@ -273,11 +315,11 @@ Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> on node <c><anno>Node</anno></c>. No response is delivered to the - calling process. <c>erpc:cast()</c> returns immediately + calling process. <c>cast()</c> returns immediately after the cast request has been sent. Any failures beside bad arguments are silently ignored. </p> - <p><c>erpc:cast/4</c> fails with an <c>{erpc, badarg}</c> + <p><c>cast/4</c> fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Node</anno></c> is not an atom.</p></item> @@ -305,13 +347,13 @@ <p> Check if a message is a response to a <c>call</c> request previously made by the calling process using - <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>. + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>. <c><anno>RequestId</anno></c> should be the value returned - from the previously made <c>erpc:send_request()</c> call, + from the previously made <c>send_request/4</c> call, and the corresponding response should not already have been - received and handled to completion by <c>erpc:check_response()</c>, - <seemfa marker="#receive_response/2"><c>erpc:receive_response()</c></seemfa>, or - <seemfa marker="#wait_response/2"><c>erpc:wait_response()</c></seemfa>. + received and handled to completion by <c>check_response/2</c>, + <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>, or + <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>. <c><anno>Message</anno></c> is the message to check. </p> <p> @@ -323,9 +365,9 @@ corresponds to the value returned from the applied function or an exception is raised. The exceptions that can be raised corresponds to the same exceptions as can be raised by - <seemfa marker="#call/4"><c>erpc:call/4</c></seemfa>. + <seemfa marker="#call/4"><c>call/4</c></seemfa>. That is, no <c>{erpc, timeout}</c> <c>error</c> exception - can be raised. <c>erpc:check_response()</c> will fail with + can be raised. <c>check_response()</c> will fail with an <c>{erpc, badarg}</c> exception if/when an invalid <c><anno>RequestId</anno></c> is detected. </p> @@ -341,14 +383,89 @@ </func> <func> + <name name="check_response" arity="3" since="OTP 25.0"/> + <fsummary>Check if a message is a response corresponding to a + previously sent call request.</fsummary> + <desc> + <p> + Check if a message is a response to a <c>call</c> request corresponding + to a request identifier saved in <c><anno>RequestIdCollection</anno></c>. + All request identifiers of <c><anno>RequestIdCollection</anno></c> must + correspond to requests that have been made using + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>, + and all requests must have been made by the process calling this + function. + </p> + <p> + <c><anno>Label</anno></c> is the label associated with the request + identifier of the request that the response corresponds to. + A request identifier is associated with a label when + <seemfa marker="#reqids_add/3">adding a request identifier</seemfa> + in a <seetype marker="#request_id_collection">request identifier + collection</seetype>, or when sending the request using + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>. + </p> + <p> + Compared to + <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>, + the returned result associated with a specific request identifier + or an exception associated with a specific request identifier will + be wrapped in a 3-tuple. The first element of this tuple equals the + value that would have been produced by <c>check_response/2</c>, + the second element equals the <c><anno>Label</anno></c> associated + with the specific request identifier, and the third element + <c><anno>NewRequestIdCollection</anno></c> is a possibly modified + request identifier collection. The <c>error</c> exception <c>{erpc, + badarg}</c> is not associated with any specific request identifier, + and will hence not be wrapped. + </p> + <p> + If <c><anno>RequestIdCollection</anno></c> is empty, the atom + <c>no_request</c> will be returned. If <c><anno>Message</anno></c> + does not correspond to any of the request identifiers in + <c><anno>RequestIdCollection</anno></c>, the atom + <c>no_response</c> is returned. + </p> + <p> + If <c><anno>Delete</anno></c> equals <c>true</c>, the association + with <c><anno>Label</anno></c> will have been deleted from + <c><anno>RequestIdCollection</anno></c> in the resulting + <c><anno>NewRequestIdCollection</anno></c>. If + <c><anno>Delete</anno></c> equals <c>false</c>, + <c><anno>NewRequestIdCollection</anno></c> will equal + <c><anno>RequestIdCollection</anno></c>. Note that deleting an + association is not for free and that a collection containing + already handled requests can still be used by subsequent calls to + <c>check_response/3</c>, + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>, + and + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>. + However, without deleting handled associations, the above calls will + not be able to detect when there are no more outstanding requests to + handle, so you will have to keep track of this some other way than + relying on a <c>no_request</c> return. Note that if you pass a + collection only containing associations of already handled or + abandoned requests to <c>check_response/3</c>, it will always + return <c>no_response</c>. + </p> + <p> + Note that a response might have been consumed uppon an <c>{erpc, + badarg}</c> exception and if so, will be lost for ever. + </p> + </desc> + </func> + + <func> <name name="multicall" arity="2" since="OTP 23.0"/> <name name="multicall" arity="3" since="OTP 23.0"/> <fsummary>Evaluate a function call on a node.</fsummary> <desc> <p> The same as calling - <seemfa marker="#multicall/5"><c>erpc:multicall(<anno>Nodes</anno>,erlang,apply,[<anno>Fun</anno>,[]],<anno>Timeout</anno>)</c></seemfa>. - May raise all the same exceptions as <c>erpc:multicall/5</c> + <seemfa marker="#multicall/5"><c>erpc:multicall(<anno>Nodes</anno>, + erlang, apply, [<anno>Fun</anno>,[]], <anno>Timeout</anno>)</c></seemfa>. + May raise all the same exceptions as <c>multicall/5</c> plus an <c>{erpc, badarg}</c> <c>error</c> exception if <c><anno>Fun</anno></c> is not a fun of zero arity. @@ -372,15 +489,13 @@ Performs multiple <c>call</c> operations in parallel on multiple nodes. That is, evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>, - <anno>Args</anno>)</c> on the nodes - <c><anno>Nodes</anno></c> in parallel. - <c><anno>Timeout</anno></c> is an integer representing - the timeout in milliseconds or the atom <c>infinity</c> - which prevents the operation from ever timing out. - The result is returned as a list where - the result from each node is placed at the same position - as the node name is placed in <c><anno>Nodes</anno></c>. - Each item in the resulting list is formatted as either: + <anno>Args</anno>)</c> on the nodes <c><anno>Nodes</anno></c> + in parallel. <c><anno>Timeout</anno></c> sets an upper time + limit for all <c>call</c> operations to complete. The result + is returned as a list where the result from each node is placed + at the same position as the node name is placed in + <c><anno>Nodes</anno></c>. Each item in the resulting list is + formatted as either: </p> <taglist> <tag><c>{ok, Result}</c></tag> @@ -393,12 +508,12 @@ The <c>call</c> operation for this specific node raised an exception of class <c>Class</c> with exception reason <c>ExceptionReason</c>. These - corresponds the the exceptions that - <seemfa marker="#call/5"><c>erpc:call/5</c></seemfa> + correspond to the exceptions that + <seemfa marker="#call/5"><c>call/5</c></seemfa> can raise. </p></item> </taglist> - <p><c>erpc:multicall/5</c> fails with an <c>{erpc, badarg}</c> + <p><c>multicall/5</c> fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Nodes</anno></c> is not a proper list of @@ -416,8 +531,12 @@ to the call <c>erpc:multicall(<anno>Nodes</anno>, <anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>, infinity)</c>. These calls are also equivalent to calling <c>my_multicall(Nodes, Module, - Function, Args)</c> if one disregard performance and failure - behavior: + Function, Args)</c> below if one disregard performance and failure + behavior. <c>multicall()</c> can utilize a selective receive + optimization which removes the need to scan the message queue from + the beginning in order to find a matching message. The + <c>send_request()/receive_response()</c> combination can, + however, not utilize this optimization. </p> <pre> my_multicall(Nodes, Module, Function, Args) -> @@ -436,12 +555,6 @@ my_multicall(Nodes, Module, Function, Args) -> ReqIds). </pre> - <p> - The <c><anno>Timeout</anno></c> value in milliseconds - sets an upper time limit for all <c>call</c> operations - to complete. - </p> - <p> If an <c>erpc</c> operation fails, but it is unknown if the function is/will be applied (that is, a timeout, @@ -473,7 +586,7 @@ my_multicall(Nodes, Module, Function, Args) -> The same as calling <seemfa marker="#multicast/4"><c>erpc:multicast(<anno>Nodes</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>. </p> - <p><c>erpc:multicast/2</c> fails with an <c>{erpc, badarg}</c> + <p><c>multicast/2</c> fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Nodes</anno></c> is not a proper list of atoms.</p></item> @@ -490,11 +603,11 @@ my_multicall(Nodes, Module, Function, Args) -> Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>)</c> on the nodes <c><anno>Nodes</anno></c>. No response is delivered to the - calling process. <c>erpc:multicast()</c> returns immediately + calling process. <c>multicast()</c> returns immediately after the cast requests have been sent. Any failures beside bad arguments are silently ignored. </p> - <p><c>erpc:multicast/4</c> fails with an <c>{erpc, badarg}</c> + <p><c>multicast/4</c> fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Nodes</anno></c> is not a proper list of @@ -515,9 +628,21 @@ my_multicall(Nodes, Module, Function, Args) -> </note> </desc> </func> - + <func> <name name="receive_response" arity="1" since="OTP 23.0"/> + <fsummary>Receive a call response corresponding to a + previously sent call request.</fsummary> + <desc> + <p> + The same as calling + <seemfa marker="#receive_response/2"><c>erpc:receive_response(<anno>RequestId</anno>, + infinity)</c></seemfa>. + </p> + </desc> + </func> + + <func> <name name="receive_response" arity="2" since="OTP 23.0"/> <fsummary>Receive a call response corresponding to a previously sent call request.</fsummary> @@ -525,34 +650,41 @@ my_multicall(Nodes, Module, Function, Args) -> <p> Receive a response to a <c>call</c> request previously made by the calling process using - <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>. + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>. <c><anno>RequestId</anno></c> should be the value returned from - the previously made <c>erpc:send_request()</c> call, and + the previously made <c>send_request/4</c> call, and the corresponding response should not already have been received - and handled to completion by - <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa>, - <c>erpc:receive_response()</c>, or - <seemfa marker="#wait_response/2"><c>erpc:wait_response()</c></seemfa>. - <c><anno>Timeout</anno></c> is an integer representing - the timeout in milliseconds or the atom <c>infinity</c> - which prevents the operation from ever timing out. The <c>call</c> - operation is completed once the <c>erpc:receive_response()</c> call - returns or raise an exception. - </p> - <p> - The call <c>erpc:receive_response(<anno>RequestId</anno>)</c> is - equivalent to the call - <c>erpc:receive_response(<anno>RequestId</anno>, infinity)</c>. + and handled to completion by <c>receive_response()</c>, + <seemfa marker="#check_response/2"><c>check_response/4</c></seemfa>, + or + <seemfa marker="#wait_response/2"><c>wait_response/4</c></seemfa>. + </p> + <p> + <c><anno>Timeout</anno></c> sets an upper time limit on how + long to wait for a response. If the operation times out, the request + identified by <c><anno>RequestId</anno></c> will be abandoned, then an + <c>{erpc, timeout}</c> <c>error</c> exception will be raised. That is, + no response corresponding to the request will ever be received after a + timeout. If a response is received, the <c>call</c> operation is + completed and either the result is returned or an exception is raised. The + exceptions that can be raised corresponds to the same exceptions as can + be raised by <seemfa marker="#call/5"><c>call/5</c></seemfa>. + <c>receive_response/2</c> will fail with an <c>{erpc, badarg}</c> + exception if/when an invalid <c><anno>RequestId</anno></c> is detected + or if an invalid <c><anno>Timeout</anno></c> is passed. </p> + <p> A call to the function <c>my_call(Node, Module, Function, Args, Timeout)</c> below is equivalent to the call <seemfa marker="#call/5"><c>erpc:call(Node, Module, Function, Args, - Timeout)</c></seemfa> if one disregards performance. <c>erpc:call()</c> - can utilize a message queue optimization which removes the need to scan - the whole message queue which the combination - <c>erpc:send_request()/erpc:receive_response()</c> cannot. + Timeout)</c></seemfa> if one disregards performance. <c>call()</c> + can utilize a selective receive optimization which removes + the need to scan the message queue from the beginning in + order to find a matching message. The + <c>send_request()/receive_response()</c> combination can, + however, not utilize this optimization. </p> <pre> my_call(Node, Module, Function, Args, Timeout) -> @@ -568,15 +700,157 @@ my_call(Node, Module, Function, Args, Timeout) -> communicates with the calling process, such communication may, of course, reach the calling process. </p> - - <p> - <c>erpc:receive_response()</c> will return or raise exceptions the - same way as <seemfa marker="#call/5"><c>erpc:call/5</c></seemfa> - does with the exception of <c>{erpc, badarg}</c>. An - <c>{erpc, badarg}</c> exception will be raised if/when an invalid - <c><anno>RequestId</anno></c> is detected or if an invalid - <c><anno>Timeout</anno></c> is passed. + </desc> + </func> + + <func> + <name name="receive_response" arity="3" since="OTP 25.0"/> + <fsummary>Receive a call response corresponding to a + previously sent call request.</fsummary> + <desc> + <p> + Receive a response to a <c>call</c> request corresponding to a request + identifier saved in <c><anno>RequestIdCollection</anno></c>. All + request identifiers of <c><anno>RequestIdCollection</anno></c> must + correspond to requests that have been made using + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>, + and all requests must have been made by the process calling this + function. </p> + <p> + <c><anno>Label</anno></c> is the label associated with the request + identifier of the request that the response corresponds to. + A request identifier is associated with a label when + <seemfa marker="#reqids_add/3">adding a request identifier</seemfa> + in a <seetype marker="#request_id_collection">request identifier + collection</seetype>, or when sending the request using + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>. + </p> + <p> + Compared to + <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>, + the returned result associated with a specific request identifier + or an exception associated with a specific request identifier will + be wrapped in a 3-tuple. The first element of this tuple equals the + value that would have been produced by <c>receive_response/2</c>, + the second element equals the <c><anno>Label</anno></c> associated + with the specific request identifier, and the third element + <c><anno>NewRequestIdCollection</anno></c> is a possibly modified + request identifier collection. The <c>error</c> exceptions <c>{erpc, + badarg}</c> and <c>{erpc, timeout}</c> are not associated with any + specific request identifiers, and will hence not be wrapped. + </p> + <p> + If <c><anno>RequestIdCollection</anno></c> is empty, the atom + <c>no_request</c> will be returned. + </p> + <p> + If the operation times out, all requests identified by + <c><anno>RequestIdCollection</anno></c> will be abandoned, then an + <c>{erpc, timeout}</c> <c>error</c> exception will be raised. That is, + no responses corresponding to any of the request identifiers in + <c><anno>RequestIdCollection</anno></c> will ever be received after a + timeout. The difference between <c>receive_response/3</c> and + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa> + is that <c>receive_response/3</c> abandons the requests at timeout + so that any potential future responses are ignored, while + <c>wait_response/3</c> does not. + </p> + <p> + If <c><anno>Delete</anno></c> equals <c>true</c>, the association + with <c><anno>Label</anno></c> will have been deleted from + <c><anno>RequestIdCollection</anno></c> in the resulting + <c><anno>NewRequestIdCollection</anno></c>. If + <c><anno>Delete</anno></c> equals <c>false</c>, + <c><anno>NewRequestIdCollection</anno></c> will equal + <c><anno>RequestIdCollection</anno></c>. Note that deleting an + association is not for free and that a collection containing + already handled requests can still be used by subsequent calls to + <c>receive_response/3</c>, + <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>, + and + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>. + However, without deleting handled associations, the above calls will + not be able to detect when there are no more outstanding requests to + handle, so you will have to keep track of this some other way than + relying on a <c>no_request</c> return. Note that if you pass a + collection only containing associations of already handled or + abandoned requests to <c>receive_response/3</c>, it will always block + until a timeout determined by <c><anno>Timeout</anno></c> is + triggered. + </p> + <p> + Note that a response might have been consumed uppon an <c>{erpc, + badarg}</c> exception and if so, will be lost for ever. + </p> + </desc> + </func> + + <func> + <name name="reqids_add" arity="3" since="OTP 25.0"/> + <fsummary>Save a request identifier.</fsummary> + <desc> + <p> + Saves <c><anno>RequestId</anno></c> and associates a + <c><anno>Label</anno></c> with the request identifier by adding this + information to <c><anno>RequestIdCollection</anno></c> and returning + the resulting request identifier collection. + </p> + </desc> + </func> + + <func> + <name name="reqids_new" arity="0" since="OTP 25.0"/> + <fsummary>Create a new empty request identifier collection.</fsummary> + <desc> + <p> + Returns a new empty request identifier collection. A + request identifier collection can be utilized in order + the handle multiple outstanding requests. + </p> + <p> + Request identifiers of requests made by + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> + can be saved in a request identifier collection using + <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>. + Such a collection of request identifiers can later be used in + order to get one response corresponding to a request in the + collection by passing the collection as argument to + <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>, + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>, + and + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>. + </p> + <p> + <seemfa marker="#reqids_size/1"><c>reqids_size/1</c></seemfa> + can be used to determine the amount of request identifiers in a + request identifier collection. + </p> + </desc> + </func> + + <func> + <name name="reqids_size" arity="1" since="OTP 25.0"/> + <fsummary>Get size of a request identifier collection.</fsummary> + <desc> + <p> + Returns the amount of request identifiers saved in + <c><anno>RequestIdCollection</anno></c>. + </p> + </desc> + </func> + + <func> + <name name="reqids_to_list" arity="1" since="OTP 25.0"/> + <fsummary>Get a list a request identifier/label associations in a collection.</fsummary> + <desc> + <p> + Returns a list of <c>{<anno>RequestId</anno>, <anno>Label</anno>}</c> + tuples which corresponds to all request identifiers with their + associated labels present in the <c><anno>RequestIdCollection</anno></c> + collection. + </p> </desc> </func> @@ -586,10 +860,10 @@ my_call(Node, Module, Function, Args, Timeout) -> <desc> <p> The same as calling - <seemfa marker="#send_request/4"><c>erpc:send_request(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>. + <seemfa marker="#send_request/4"><c>erpc:send_request(<anno>Node</anno>, + erlang, apply, [<anno>Fun</anno>, []])</c></seemfa>. </p> - <p><c>erpc:send_request/2</c> fails with an <c>{erpc, badarg}</c> - <c>error</c> exception if:</p> + <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Node</anno></c> is not an atom.</p></item> <item><p><c><anno>Fun</anno></c> is not a fun of @@ -606,34 +880,158 @@ my_call(Node, Module, Function, Args, Timeout) -> </func> <func> - <name name="send_request" arity="4" since="OTP 23.0"/> + <name name="send_request" arity="4" clause_i="1" since="OTP 23.0"/> <fsummary>Send a request to evaluate a function call on a node.</fsummary> <desc> <p> Send an asynchronous <c>call</c> request to the node - <c><anno>Node</anno></c>. <c>erpc:send_request()</c> + <c><anno>Node</anno></c>. <c>send_request/4</c> returns a request identifier that later is to be passed - as argument to either - <seemfa marker="#receive_response/1"><c>erpc:receive_response()</c></seemfa>, - <seemfa marker="#wait_response/1"><c>erpc:wait_response()</c></seemfa>, + to either + <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>, + <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>, + or, + <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa> + in order to get the response of the call request. Besides passing + the request identifier directly to these functions, it can also be + added in a request identifier collection using + <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>. + Such a collection of request identifiers can later be used in + order to get one response corresponding to a request in the + collection by passing the collection as argument to + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>, + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>, or, - <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa> - in order to get the response of the call request. + <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>. + If you are about to save the request identifier in a request identifier + collection, you may want to consider using + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa> + instead. + </p> + <p> + A call to the function + <c>my_call(Node, Module, Function, Args, Timeout)</c> + below is equivalent to the call + <seemfa marker="#call/5"><c>erpc:call(Node, Module, Function, Args, + Timeout)</c></seemfa> if one disregards performance. <c>call()</c> + can utilize a selective receive optimization which removes + the need to scan the message queue from the beginning in + order to find a matching message. The + <c>send_request()/receive_response()</c> combination can, + however, not utilize this optimization. </p> - <p><c>erpc:send_request()</c> fails with an <c>{erpc, badarg}</c> - <c>error</c> exception if:</p> + <pre> +my_call(Node, Module, Function, Args, Timeout) -> + RequestId = erpc:send_request(Node, Module, Function, Args), + <seemfa marker="#receive_response/2">erpc:receive_response(RequestId, Timeout)</seemfa>. +</pre> + <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> + <list> + <item><p><c><anno>Node</anno></c> is not an atom.</p></item> + <item><p><c><anno>Module</anno></c> is not an atom.</p></item> + <item><p><c><anno>Function</anno></c> is not an atom.</p></item> + <item><p><c><anno>Args</anno></c> is not a list. Note that the + list is not verified to be a proper list at the client side.</p></item> + </list> + <note> + <p> + You cannot make <em>any</em> assumptions about the + process that will perform the <c>apply()</c>. It may + be a server, or a freshly spawned process. + </p> + </note> + </desc> + </func> + + <func> + <name name="send_request" arity="4" clause_i="2" since="OTP 25.0"/> + <fsummary>Send a request to evaluate a function call on a node.</fsummary> + <desc> + <p> + The same as calling + <seemfa marker="#send_request/6"><c>erpc:send_request(<anno>Node</anno>, + erlang, apply, [<anno>Fun</anno>,[]]), <anno>Label</anno>, + <anno>RequestIdCollection</anno>)</c></seemfa>. + </p> + <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> + <list> + <item><p><c><anno>Node</anno></c> is not an atom.</p></item> + <item><p><c><anno>Fun</anno></c> is not a fun of zero arity.</p></item> + <item><p><c><anno>RequestIdCollection</anno></c> is detected not to + be request identifier collection.</p></item> + </list> + <note> + <p> + You cannot make <em>any</em> assumptions about the + process that will perform the <c>apply()</c>. It may + be a server, or a freshly spawned process. + </p> + </note> + </desc> + </func> + + <func> + <name name="send_request" arity="6" since="OTP 25.0"/> + <fsummary>Send a request to evaluate a function call on a node.</fsummary> + <desc> + <p> + Send an asynchronous <c>call</c> request to the node + <c><anno>Node</anno></c>. The <c><anno>Label</anno></c> will be + associated with the request identifier of the operation and + added to the returned request identifier collection + <c><anno>NewRequestIdCollection</anno></c>. The collection can + later be used in order to get one response corresponding to a + request in the collection by passing the collection as argument to + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>, + <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>, + or, + <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>. + </p> + + <p> + The same as calling + <seemfa marker="#reqids_add/3"><c>erpc:reqids_add</c></seemfa>(<seemfa + marker="#send_request/4"><c>erpc:send_request</c></seemfa><c>(<anno>Node</anno>, + <anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>), + <anno>Label</anno>, <anno>RequestIdCollection</anno>)</c>, but + calling <c>send_request/6</c> is slightly more efficient. + </p> + + <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p> <list> <item><p><c><anno>Node</anno></c> is not an atom.</p></item> <item><p><c><anno>Module</anno></c> is not an atom.</p></item> <item><p><c><anno>Function</anno></c> is not an atom.</p></item> <item><p><c><anno>Args</anno></c> is not a list. Note that the list is not verified to be a proper list at the client side.</p></item> + <item><p><c><anno>RequestIdCollection</anno></c> is detected not to + be request identifier collection.</p></item> </list> + <note> + <p> + You cannot make <em>any</em> assumptions about the + process that will perform the <c>apply()</c>. It may + be a server, or a freshly spawned process. + </p> + </note> + </desc> + </func> + + <func> + <name name="wait_response" arity="1" clause_i="1" since="OTP 23.0"/> + <fsummary>Poll for a call response corresponding to a previously + sent call request.</fsummary> + <desc> + <p> + The same as calling + <seemfa marker="#wait_response/2"><c>erpc:wait_response(<anno>RequestId</anno>, + 0)</c></seemfa>. That is, poll for a response message to a <c>call</c> + request previously made by the calling process. + </p> </desc> </func> <func> - <name name="wait_response" arity="1" since="OTP 23.0"/> <name name="wait_response" arity="2" since="OTP 23.0"/> <fsummary>Wait or poll for a call response corresponding to a previously sent call request.</fsummary> @@ -641,40 +1039,30 @@ my_call(Node, Module, Function, Args, Timeout) -> <p> Wait or poll for a response message to a <c>call</c> request previously made by the calling process using - <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>. + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>. <c><anno>RequestId</anno></c> should be the value returned from - the previously made <c>erpc:send_request()</c> call, and the + the previously made <c>send_request()</c> call, and the corresponding response should not already have been received and handled to completion by - <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa>, - <seemfa marker="#receive_response/2"><c>erpc:receive_response()</c></seemfa>, - or <c>erpc:wait_response()</c>. <c><anno>WaitTime</anno></c> equals the - time to wait in milliseconds (or the atom <c>infinity</c>) during the wait. - <c><anno>WaitTime</anno></c> is an integer representing time to wait - in milliseconds or the atom <c>infinity</c> which will cause - <c>wait_response/2</c> to wait for a response until it appears - regardless of how long time that is. + <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>, + <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>, + or <c>wait_response()</c>. </p> <p> - The call <c>erpc:wait_response(<anno>RequestId</anno>)</c> is equivalent - to the call <c>erpc:wait_response(<anno>RequestId</anno>, 0)</c>. That is, - poll for a response message to a <c>call</c> request previously made by - the calling process. - </p> - <p> - If no response is received before <c><anno>WaitTime</anno></c> milliseconds, - the atom <c>no_response</c> is returned. It is valid to continue waiting - for a response as many times as needed up until a response has - been received and completed by <c>erpc:check_response()</c>, - <c>erpc:receive_response()</c>, or <c>erpc:wait_response()</c>. If a - response is received, the <c>call</c> operation is completed and either - the result is returned as <c>{response, Result}</c> where <c>Result</c> - corresponds to the value returned from the applied function or an - exception is raised. The exceptions that can be raised corresponds to the - same exceptions as can be raised by - <seemfa marker="#call/4"><c>erpc:call/4</c></seemfa>. + <c><anno>WaitTime</anno></c> sets an upper time limit on how long to wait + for a response. If no response is received before the + <c><anno>WaitTime</anno></c> timeout has triggered, the atom + <c>no_response</c> is returned. It is valid to continue waiting for a + response as many times as needed up until a response has been received + and completed by <c>check_response()</c>, <c>receive_response()</c>, or + <c>wait_response()</c>. If a response is received, the <c>call</c> + operation is completed and either the result is returned as + <c>{response, Result}</c> where <c>Result</c> corresponds to the value + returned from the applied function or an exception is raised. The + exceptions that can be raised corresponds to the same exceptions as can + be raised by <seemfa marker="#call/4"><c>call/4</c></seemfa>. That is, no <c>{erpc, timeout}</c> <c>error</c> exception can be raised. - <c>erpc:wait_response()</c> will fail with an <c>{erpc, badarg}</c> + <c>wait_response/2</c> will fail with an <c>{erpc, badarg}</c> exception if/when an invalid <c><anno>RequestId</anno></c> is detected or if an invalid <c><anno>WaitTime</anno></c> is passed. </p> @@ -690,6 +1078,87 @@ my_call(Node, Module, Function, Args, Timeout) -> </desc> </func> + <func> + <name name="wait_response" arity="3" since="OTP 25.0"/> + <fsummary>Wait or poll for a call response corresponding to a previously + sent call request.</fsummary> + <desc> + <p> + Wait or poll for a response to a <c>call</c> request corresponding + to a request identifier saved in <c><anno>RequestIdCollection</anno></c>. All + request identifiers of <c><anno>RequestIdCollection</anno></c> must + correspond to requests that have been made using + <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>, + and all requests must have been made by the process calling this + function. + </p> + <p> + <c><anno>Label</anno></c> is the label associated with the request + identifier of the request that the response corresponds to. + A request identifier is associated with a label when + <seemfa marker="#reqids_add/3">adding a request identifier</seemfa> + in a <seetype marker="#request_id_collection">request identifier + collection</seetype>, or when sending the request using + <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>. + </p> + <p> + Compared to + <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>, + the returned result associated with a specific request identifier + or an exception associated with a specific request identifier will + be wrapped in a 3-tuple. The first element of this tuple equals the + value that would have been produced by <c>wait_response/2</c>, + the second element equals the <c><anno>Label</anno></c> associated + with the specific request identifier, and the third element + <c><anno>NewRequestIdCollection</anno></c> is a possibly modified + request identifier collection. The <c>error</c> exception <c>{erpc, + badarg}</c> is not associated with any specific request identifier, + and will hence not be wrapped. + </p> + <p> + If <c><anno>RequestIdCollection</anno></c> is empty, <c>no_request</c> + will be returned. If no response is received before the + <c><anno>WaitTime</anno></c> timeout has triggered, the atom + <c>no_response</c> is returned. It is valid to continue waiting for a + response as many times as needed up until a response has been received + and completed by <c>check_response()</c>, <c>receive_response()</c>, + or <c>wait_response()</c>. The difference between + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa> + and <c>wait_response/3</c> is that <c>receive_response/3</c> + abandons requests at timeout so that any potential future + responses are ignored, while <c>wait_response/3</c> does not. + </p> + <p> + If <c><anno>Delete</anno></c> equals <c>true</c>, the association + with <c><anno>Label</anno></c> will have been deleted from + <c><anno>RequestIdCollection</anno></c> in the resulting + <c><anno>NewRequestIdCollection</anno></c>. If + <c><anno>Delete</anno></c> equals <c>false</c>, + <c><anno>NewRequestIdCollection</anno></c> will equal + <c><anno>RequestIdCollection</anno></c>. Note that deleting an + association is not for free and that a collection containing + already handled requests can still be used by subsequent calls to + <c>wait_response/3</c>, + <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>, + and + <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>. + However, without deleting handled associations, the above calls will + not be able to detect when there are no more outstanding requests to + handle, so you will have to keep track of this some other way than + relying on a <c>no_request</c> return. Note that if you pass a + collection only containing associations of already handled or + abandoned requests to <c>wait_response/3</c>, it will always block + until a timeout determined by <c><anno>WaitTime</anno></c> is + triggered and then return <c>no_response</c>. + </p> + <p> + Note that a response might have been consumed uppon an <c>{erpc, + badarg}</c> exception and if so, will be lost for ever. + </p> + </desc> + </func> + </funcs> </erlref> |