Waiting for a Single Event for Read/Write

Before reading data, a connection must be established between two endpoint processes. This can be done by calling NvSciIpcGetEventSafe().

Basic event handling mechanism is already described in Writing to the NvSciIpc Endpoint section. (The only difference is calling WaitForEvent() instead of select()).

Note:

WaitForEvent() is an event-blocking call. It must be called from a single thread only.

To process the write event in a loop, add the WRITE event check routine and NvSciIpcWriteSafe().

Wait for a single event for read

NvSciEventLoopService *eventLoopService;
NvSciIpcEndpoint ipcEndpoint;
NvSciEventNotifier *eventNotifier;
struct NvSciIpcEndpointInfo info;
int64_t timeout;
uint32_t event = 0;
void *buf;
int32_t buf_size, bytes;
int retval;
NvSciError err;
timeout = NV_SCI_EVENT_INFINITE_WAIT;
buf = malloc(info.frame_size);
if (buf == NULL) {
    goto fail;
}  
buf_size = info.frame_size;
while (1) {
       err = NvSciIpcGetEventSafe(ipcEndpoint, &event);
       if (err != NvSciError_Success) {
                goto fail;
       }
       if (event & NV_SCI_IPC_EVENT_READ) {
               /* Assuming buf contains pointer to area where frame is read.
                * buf_size contains the size of data. It should be less than
                * Endpoint frame size.
                */
               err = NvSciIpcReadSafe(ipcEndpoint, buf, buf_size, &bytes);
               if(err != NvSciError_Success) {
                      printf("error in reading endpoint\n");
                      goto fail;
               }
       } else {                      
               err = eventLoopService->WaitForEvent(eventNotifier, timeout);
               if(err != NvSciError_Success) {
                      printf("error in waiting event\n");
                      goto fail;
               }
        }
}