为什么会有一个errno S_objLib_OBJ_UNAVAILABLE?
why is there a errno S_objLib_OBJ_UNAVAILABLE?
我想将一些数据发送到队列,但由于某种原因收到错误号 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 %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);
}
这里可能发生了什么?
我可以确认,队列句柄在调用 msgQCreate()
和 msgQSend()
之间保持不变
从手册(特别是内核 API 参考指南)中,我们可以看到当队列中没有空间时,errno 将设置为 S_objLib_OBJ_UNAVAILABLE
,并且您已指定 NO_WAIT 作为超时值。
S_objLib_OBJ_UNAVAILABLE No free buffer space was available and the
NO_WAIT timeout was specified.
我们可以在您的代码中看到您指定了 NO_WAIT。没有任何迹象表明 msgQ 应该已满 - 但也许您还没有显示所有代码。
要检查的事项:
MAX_BFD_MSGS
的定义 - 确保它足够大
- 确保正在从队列中读取内容。
- 考虑使用
WAIT_FOREVER
。这将导致 msgQSend
操作阻塞,直到队列中有 space。
我想将一些数据发送到队列,但由于某种原因收到错误号 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 %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);
}
这里可能发生了什么?
我可以确认,队列句柄在调用 msgQCreate()
和 msgQSend()
从手册(特别是内核 API 参考指南)中,我们可以看到当队列中没有空间时,errno 将设置为 S_objLib_OBJ_UNAVAILABLE
,并且您已指定 NO_WAIT 作为超时值。
S_objLib_OBJ_UNAVAILABLE No free buffer space was available and the NO_WAIT timeout was specified.
我们可以在您的代码中看到您指定了 NO_WAIT。没有任何迹象表明 msgQ 应该已满 - 但也许您还没有显示所有代码。
要检查的事项:
MAX_BFD_MSGS
的定义 - 确保它足够大- 确保正在从队列中读取内容。
- 考虑使用
WAIT_FOREVER
。这将导致msgQSend
操作阻塞,直到队列中有 space。