getMessageList 方法用于检索消息列表。出于以下两个原因而使用此方法:
销毁某个反应类时,将通知其线程取消队列中所有对该反应类触发的事件。线程将通过使用 getMessageList 检索数据来遍历此队列,并且将目标为此反应类的所有事件都标记为“已被取消”。
RiCOSResult RiCOSMessageQueue_getMessageList(
RiCOSMessageQueue * const me, RiCList * l)
{
RiCList_removeAll(l);
if (me == NULL) return 0;
if (!RiCOSMessageQueue_isEmpty(me)) {
MSG_Q_INFO msgQInfo;
if (noData != me->m_State) {
RiCList_addTail(l,me->pmessage);
}
msgQInfo.taskIdListMax = 0;
msgQInfo.taskIdList = NULL;
/* do not care which tasks are waiting */
msgQInfo.msgListMax = 0;
msgQInfo.msgPtrList = NULL;
msgQInfo.msgLenList = NULL;
/* Do not care about message length. The
first call will retrieve the numMsgs data
member. */
if (OK == msgQInfoGet(me->hVxMQ, &msgQInfo)) {
if (msgQInfo.numMsgs > 0) {
int numMsgs = msgQInfo.numMsgs;
msgQInfo.msgListMax = numMsgs;
msgQInfo.msgPtrList = malloc(
(numMsgs+1)*sizeof(void*));
if (OK == msgQInfoGet(me->hVxMQ,&msgQInfo)) {
void *m;
int i;
for (i = 0; i < numMsgs; i++) {
m = *(void **)msgQInfo.msgPtrList[i];
RiCList_addTail(l,m);
}
}
free(msgQInfo.msgPtrList);
}
}
}
return 1;}