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;
/* 不關心哪些作業正在等待 */
msgQInfo.msgListMax = 0;
msgQInfo.msgPtrList = NULL;
msgQInfo.msgLenList = NULL;
/* 不關心訊息長度。第一個呼叫將擷取 numMsgs 資料
成員。 */
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;}