почему существует ошибка S_objLib_OBJ_UNAVAILABLE?

#c #message-queue #vxworks

#c #очередь сообщений #vxworks

Вопрос:

Я хочу отправить некоторые данные в очередь, но по какой-то причине получаю ошибку S_objLib_OBJ_UNAVAILABLE (3997698), и я не знаю почему. Вот что у меня есть:

 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 %dn",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, 
                amp;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 %dn",errno,0,0,0,0);
        }
  

Что здесь может происходить?

Я могу подтвердить, дескриптор Qeue остается неизменным между вызовами msgQCreate() и msgQSend()

Комментарии:

1. Вы включили <errno.h> ?

2. @TonyTannous да, #include "errno.h"

3. Тогда извините, понятия не имею.

Ответ №1:

Из руководства (в частности, справочного руководства по API ядра) мы видим, что значение errno будет установлено S_objLib_OBJ_UNAVAILABLE , когда в очереди не было места, и вы указали NO_WAIT в качестве значения таймаута.

S_objLib_OBJ_UNAVAILABLE Не было свободного места в буфере, и был указан тайм-аут NO_WAIT.

Мы видим в вашем коде, что вы указали NO_WAIT . Ничто не указывает на то, что msgQ должен быть полным, но, возможно, вы не показали весь код.

Что нужно проверить:

  1. Определение MAX_BFD_MSGS — убедитесь, что оно достаточно большое
  2. Убедитесь, что что-то считывается из очереди.
  3. Рассмотрите возможность использования WAIT_FOREVER . Это приведет к msgQSend блокировке операции до тех пор, пока в очереди не останется свободного места.

Комментарии:

1. Хорошо, понял, это была проблема в моем приложении, и в S_objLib_OBJ_UNAVAILABLE Не было свободного места в буфере, и был указан тайм-аут NO_WAIT. определенно помогло мне найти виновника! Спасибо!