Search code examples
cmessage-queuevxworks

why is there a errno S_objLib_OBJ_UNAVAILABLE?


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()


Solution

  • 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:

    1. Definition of MAX_BFD_MSGS - make sure it is large enough
    2. Ensure that something is reading from the queue.
    3. Consider using WAIT_FOREVER. This will cause the msgQSend operation to block until there is space in the queue.