I want to send some data to a queue but get errno S_objLib_OBJ_UNAVAILABLE (3997698) for some reason and I don't know why. Here's what I have:
static MSG_Q_ID bfd_to_alm_data = NULL;
// in bfd_queues_create(void)
if (!bfd_to_alm_data) {
bfd_to_alm_data = msgQCreate
(
MAX_BFD_MSGS, /* max messages that can be queued */
sizeof(bfd_report_t), /* max bytes in a message */
MSG_Q_FIFO /* message queue options */
);
if (!bfd_to_alm_data) {
printErrno(errno);
jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Failed to create queue for bfd messages to alarm engine. errno %d\n",errno,0,0,0,0);
return ERROR;
}
// and this is where I get the error:
if (!bfd_to_alm_data)
rv = bfd_queues_create();
if (rv < 0) {
jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Could not initialize bfd_to_alm_data! errcode %d \n",rv,0,0,0,0);
return;
}
rv = msgQSend(bfd_to_alm_data,
&bfd_info,
sizeof(bfd_report_t),
NO_WAIT,
MSG_PRI_NORMAL);
if (rv < 0) {
jpax_logMsg(LOG_ERROR, LOGSTREAM_SWITCH, "ERROR: Could not push Bfd alarm data onto queue! errno %d\n",errno,0,0,0,0);
}
What might be going on here?
I can confirm, the Qeue handle stays the same between the calls to msgQCreate()
and msgQSend()
From the manual (specifically the Kernel API reference guide), we can see that errno will be set to S_objLib_OBJ_UNAVAILABLE
when there was no room in the queue, and you have specified NO_WAIT as the timeout value.
S_objLib_OBJ_UNAVAILABLE No free buffer space was available and the NO_WAIT timeout was specified.
We can see in your code that you have specified NO_WAIT. There is nothing to indicate that the msgQ should be full - but perhaps you haven't shown all the code.
Things to check:
MAX_BFD_MSGS
- make sure it is large enoughWAIT_FOREVER
. This will cause the msgQSend
operation to block until there is space in the queue.