#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 должен быть полным, но, возможно, вы не показали весь код.
Что нужно проверить:
- Определение
MAX_BFD_MSGS
— убедитесь, что оно достаточно большое - Убедитесь, что что-то считывается из очереди.
- Рассмотрите возможность использования
WAIT_FOREVER
. Это приведет кmsgQSend
блокировке операции до тех пор, пока в очереди не останется свободного места.
Комментарии:
1. Хорошо, понял, это была проблема в моем приложении, и в S_objLib_OBJ_UNAVAILABLE Не было свободного места в буфере, и был указан тайм-аут NO_WAIT. определенно помогло мне найти виновника! Спасибо!