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;
}