blob: 087d4175a521e952b82acc5e0ce1b644e936bb26 [file] [log] [blame]
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. CAUTION: this document is generated from source in doc/src/rtd.
.. To make changes edit the source and recompile the document.
.. Do NOT make changes directly to .rst or .md files.
============================================================================================
Man Page: rmr_mt_rcv
============================================================================================
RMR LIBRARY FUNCTIONS
=====================
NAME
----
rmr_mt_rcv
SYNOPSIS
--------
::
#include <rmr/rmr.h>
rmr_mbuf_t* rmr_mt_rcv( void* vctx, rmr_mbuf_t* old_msg, int timeout );
DESCRIPTION
-----------
The ``rmr_mt_rcv`` function blocks until a message is
received, or the timeout period (milliseconds) has passed.
The result is an RMR message buffer which references a
received message. In the case of a timeout the state will be
reflected in an "empty buffer" (if old_msg was not nil, or
simply with the return of a nil pointer. If a timeout value
of zero (0) is given, then the function will block until the
next message received.
The *vctx* pointer is the pointer returned by the
``rmr_init`` function. *Old_msg* is a pointer to a previously
used message buffer or NULL. The ability to reuse message
buffers helps to avoid alloc/free cycles in the user
application. When no buffer is available to supply, the
receive function will allocate one.
The *old_msg* parameter allows the user to pass a previously
generated RMR message back to RMR for reuse. Optionally, the
user application may pass a nil pointer if no reusable
message is available. When a timeout occurs, and old_msg was
not nil, the state will be returned by returning a pointer to
the old message with the state set.
It is possible to use the *rmr_rcv_msg()* function instead of
this function. Doing so might be advantageous if the user
programme does not always start the multi-threaded mode and
the use of *rmr_rcv_msg()* would make the flow of the code
more simple. The advantages of using this function are the
ability to set a timeout without using epoll, and a small
performance gain (if multi-threaded mode is enabled, and the
*rmr_rcv_msg()* function is used, it simply invokes this
function without a timeout value, thus there is the small
cost of a second call that results). Similarly, the
*rmr_torcv_msg()* call can be used when in multi-threaded
mode with the same "pass through" overhead to using this
function directly.
RETURN VALUE
------------
When a message is received before the timeout period expires,
a pointer to the RMR message buffer which describes the
message is returned. This will, with a high probability, be a
different message buffer than *old_msg;* the user application
should not continue to use *old_msg* after it is passed to
this function.
In the event of a timeout the return value will be the old
msg with the state set, or a nil pointer if no old message
was provided.
ERRORS
------
The *state* field in the message buffer will be set to one of
the following values:
.. list-table::
:widths: auto
:header-rows: 0
:class: borderless
* - **RMR_OK**
-
The message was received without error.
* - **RMR_ERR_BADARG**
-
A parameter passed to the function was not valid (e.g. a nil
pointer). indicate either ``RMR_OK`` or ``RMR_ERR_EMPTY`` if
an empty message was received.
* - **RMR_ERR_EMPTY**
-
The message received had no associated data. The length of
the message will be 0.
* - **RMR_ERR_NOTSUPP**
-
The multi-threaded option was not enabled when RMR was
initialised. See the man page for *rmr_init()* for details.
* - **RMR_ERR_RCVFAILED**
-
A hard error occurred preventing the receive from completing.
When a nil pointer is returned, or any other state value was
set in the message buffer, ``errno`` will be set to one of
the following:
.. list-table::
:widths: auto
:header-rows: 0
:class: borderless
* - **INVAL**
-
Parameter(s) passed to the function were not valid.
* - **EBADF**
-
The underlying message transport is unable to process the
request.
* - **ENOTSUP**
-
The underlying message transport is unable to process the
request.
* - **EFSM**
-
The underlying message transport is unable to process the
request.
* - **EAGAIN**
-
The underlying message transport is unable to process the
request.
* - **EINTR**
-
The underlying message transport is unable to process the
request.
* - **ETIMEDOUT**
-
The underlying message transport is unable to process the
request.
* - **ETERM**
-
The underlying message transport is unable to process the
request.
EXAMPLE
-------
::
rmr_mbuf_t* mbuf = NULL; // received msg
msg = rmr_mt_recv( mr, mbuf, 100 ); // wait up to 100ms
if( msg != NULL ) {
switch( msg->state ) {
case RMR_OK:
printf( "got a good message\\n" );
break;
case RMR_ERR_EMPTY:
printf( "received timed out\\n" );
break;
default:
printf( "receive error: %d\\n", mbuf->state );
break;
}
} else {
printf( "receive timeout (nil)\\n" );
}
SEE ALSO
--------
rmr_alloc_msg(3), rmr_call(3), rmr_free_msg(3),
rmr_get_rcvfd(3), rmr_init(3), rmr_mk_ring(3),
rmr_mt_call(3), rmr_payload_size(3), rmr_send_msg(3),
rmr_torcv_msg(3), rmr_rcv_specific(3), rmr_rts_msg(3),
rmr_ready(3), rmr_ring_free(3), rmr_torcv_msg(3)