MsgQueueReturnCode CDVDMessageQueue::Put(CDVDMsg* pMsg) { if (!m_bInitialized) { CLog::Log(LOGWARNING, "CDVDMessageQueue::Put MSGQ_NOT_INITIALIZED"); pMsg->Release(); return MSGQ_NOT_INITIALIZED; } if (!pMsg) { CLog::Log(LOGFATAL, "CDVDMessageQueue::Put MSGQ_INVALID_MSG"); return MSGQ_INVALID_MSG; } DVDMessageListItem* msgItem = new DVDMessageListItem; if (!msgItem) { CLog::Log(LOGFATAL, "CDVDMessageQueue::Put MSGQ_OUT_OF_MEMORY"); return MSGQ_OUT_OF_MEMORY; } msgItem->pMsg = pMsg; msgItem->pNext = NULL; EnterCriticalSection(&m_critSection); if (!m_pFirstMessage) m_pFirstMessage = msgItem; else m_pLastMessage->pNext = msgItem; m_pLastMessage = msgItem; if (pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)pMsg; m_iDataSize += pMsgDemuxerPacket->GetPacketSize(); } SetEvent(m_hEvent); // inform waiter for new packet LeaveCriticalSection(&m_critSection); return MSGQ_OK; }
MsgQueueReturnCode CDVDMessageQueue::Get(CDVDMsg** pMsg, unsigned int iTimeoutInMilliSeconds) { *pMsg = NULL; DVDMessageListItem* msgItem; int ret = 0; if (!m_bInitialized) { CLog::Log(LOGFATAL, "CDVDMessageQueue::Get MSGQ_NOT_INITIALIZED"); return MSGQ_NOT_INITIALIZED; } EnterCriticalSection(&m_critSection); while (!m_bAbortRequest) { msgItem = m_pFirstMessage; if (msgItem && !m_bCaching) { m_pFirstMessage = msgItem->pNext; if (!m_pFirstMessage) m_pLastMessage = NULL; if (msgItem->pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)msgItem->pMsg; m_iDataSize -= pMsgDemuxerPacket->GetPacketSize(); } *pMsg = msgItem->pMsg; delete msgItem; // free the list item we allocated in ::Put() ret = MSGQ_OK; break; } else if (!iTimeoutInMilliSeconds) { ret = MSGQ_TIMEOUT; break; } else { ResetEvent(m_hEvent); LeaveCriticalSection(&m_critSection); // wait for a new message if (WaitForSingleObject(m_hEvent, iTimeoutInMilliSeconds) == WAIT_TIMEOUT) { // just return here directly, we have already left critical section return MSGQ_TIMEOUT; } EnterCriticalSection(&m_critSection); } } LeaveCriticalSection(&m_critSection); if (m_bAbortRequest) return MSGQ_ABORT; return (MsgQueueReturnCode)ret; }