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;
}
}
}