Man Page: rmr_get_rcvfd

RMR LIBRARY FUNCTIONS

NAME

rmr_get_rcvfd

SYNOPSIS

#include <rmr/rmr.h>

void* rmr_get_rcvfd( void* ctx )

DESCRIPTION

The rmr_get_rcvfd function returns a file descriptor which may be given to epoll_wait() by an application that wishes to use event poll in a single thread rather than block on the arrival of a message via calls to rmr_rcv_msg(). When epoll_wait() indicates that this file descriptor is ready, a call to rmr_rcv_msg() will not block as at least one message has been received.

The context (ctx) pointer passed in is the pointer returned by the call to rmr_init().

RETURN VALUE

The rmr_get_rcvfd function returns a file descriptor greater or equal to 0 on success and -1 on error.

ERRORS

The following error values are specifically set by this RMR function. In some cases the error message of a system call is propagated up, and thus this list might be incomplete.

EINVAL

The use of this function is invalid in this environment.

EXAMPLE

The following short code bit illustrates the use of this function. Error checking has been omitted for clarity.

#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <rmr/rmr.h>

int main() {
    int rcv_fd;     // pollable fd
    void* mrc;      //msg router context
    struct epoll_event events[10];          // support 10 events to poll
    struct epoll_event epe;                 // event definition for event to listen to
    int     ep_fd = -1;
    rmr_mbuf_t* msg = NULL;
    int nready;
    int i;
    int norm_msg_size = 1500;               // 95% messages are less than this

    mrc = rmr_init( "43086", norm_msg_size, RMRFL_NONE );
    rcv_fd = rmr_get_rcvfd( mrc );

    ep_fd = epoll_create1( 0 );             // initialise epoll environment
    epe.events = EPOLLIN;
    epe.data.fd = rcv_fd;
    epoll_ctl( ep_fd, EPOLL_CTL_ADD, rcv_fd, &epe );    // add our info to the mix

    while( 1 ) {
        nready = epoll_wait( ep_fd, events, 10, -1 );   // -1 == block forever (no timeout)
        for( i = 0; i < nready && i < 10; i++ ) {       // loop through to find what is ready
            if( events[i].data.fd == rcv_fd ) {         // RMR has something
                msg = rmr_rcv_msg( mrc, msg );
                if( msg ) {
                    // do something with msg
                }
            }

            // check for other ready fds....
        }
    }
}

SEE ALSO

rmr_alloc_msg(3), rmr_call(3), rmr_free_msg(3), rmr_payload_size(3), rmr_send_msg(3), rmr_rcv_msg(3), rmr_rcv_specific(3), rmr_rts_msg(3), rmr_ready(3), rmr_fib(3), rmr_has_str(3), rmr_tokenise(3), rmr_mk_ring(3), rmr_ring_free(3)