diff options
author | elupus <elupus@svn> | 2009-12-20 15:05:25 +0000 |
---|---|---|
committer | elupus <elupus@svn> | 2009-12-20 15:05:25 +0000 |
commit | 55d558978da26d0087e7b604076d2c66580b55b8 (patch) | |
tree | 4eadc496b9519accfe2c0a6c22f8c6f36ba92013 | |
parent | 902f45150aea0daeb8efb053ce22f0b90fa6a315 (diff) |
changed: use std::list instead of our own linked list for message queues
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@25882 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
-rw-r--r-- | xbmc/cores/dvdplayer/DVDMessageQueue.cpp | 98 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDMessageQueue.h | 8 |
2 files changed, 27 insertions, 79 deletions
diff --git a/xbmc/cores/dvdplayer/DVDMessageQueue.cpp b/xbmc/cores/dvdplayer/DVDMessageQueue.cpp index d7802c5e37..d525437774 100644 --- a/xbmc/cores/dvdplayer/DVDMessageQueue.cpp +++ b/xbmc/cores/dvdplayer/DVDMessageQueue.cpp @@ -28,8 +28,6 @@ using namespace std; CDVDMessageQueue::CDVDMessageQueue(const string &owner) { m_owner = owner; - m_pFirstMessage = NULL; - m_pLastMessage = NULL; m_iDataSize = 0; m_bAbortRequest = false; m_bInitialized = false; @@ -51,8 +49,6 @@ CDVDMessageQueue::~CDVDMessageQueue() void CDVDMessageQueue::Init() { - m_pFirstMessage = NULL; - m_pLastMessage = NULL; m_iDataSize = 0; m_bAbortRequest = false; m_bEmptied = true; @@ -63,30 +59,15 @@ void CDVDMessageQueue::Flush(CDVDMsg::Message type) { EnterCriticalSection(&m_critSection); - if (m_bInitialized) + for(SList::iterator it = m_list.begin(); it != m_list.end();) { - DVDMessageListItem first; - first.pNext = m_pFirstMessage; - - DVDMessageListItem *pLast = &first; - DVDMessageListItem *pCurr; - while ((pCurr = pLast->pNext)) + if (it->pMsg->IsType(type) || type == CDVDMsg::NONE) { - if (pCurr->pMsg->IsType(type) || type == CDVDMsg::NONE) - { - pLast->pNext = pCurr->pNext; - pCurr->pMsg->Release(); - delete pCurr; - } - else - pLast = pCurr; + it->pMsg->Release(); + it = m_list.erase(it); } - - m_pFirstMessage = first.pNext; - if(pLast == &first) - m_pLastMessage = NULL; else - m_pLastMessage = pLast; + it++; } if (type == CDVDMsg::DEMUXER_PACKET || type == CDVDMsg::NONE) @@ -116,8 +97,6 @@ void CDVDMessageQueue::End() EnterCriticalSection(&m_critSection); m_bInitialized = false; - m_pFirstMessage = NULL; - m_pLastMessage = NULL; m_iDataSize = 0; m_bAbortRequest = false; @@ -139,47 +118,23 @@ MsgQueueReturnCode CDVDMessageQueue::Put(CDVDMsg* pMsg, int priority) return MSGQ_INVALID_MSG; } - DVDMessageListItem* msgItem = new DVDMessageListItem; + DVDMessageListItem item; - if (!msgItem) - { - CLog::Log(LOGFATAL, "CDVDMessageQueue(%s)::Put MSGQ_OUT_OF_MEMORY", m_owner.c_str()); - return MSGQ_OUT_OF_MEMORY; - } - - msgItem->pMsg = pMsg; - msgItem->pNext = NULL; - msgItem->priority = priority; + item.pMsg = pMsg; + item.priority = priority; EnterCriticalSection(&m_critSection); - if(!m_pLastMessage || (m_pLastMessage && m_pLastMessage->priority >= priority)) + + SList::iterator it = m_list.begin(); + while(it != m_list.end()) { - /* quick path to just add at the end */ - if (!m_pFirstMessage) m_pFirstMessage = msgItem; - else m_pLastMessage->pNext = msgItem; - m_pLastMessage = msgItem; + if(priority <= it->priority) + break; + it++; } - else - { - /* add in prio order */ - DVDMessageListItem* pCurr = m_pFirstMessage; - DVDMessageListItem* pLast = NULL; - - while (pCurr && pCurr->priority >= priority) - { - pLast = pCurr; - pCurr = pCurr->pNext; - } + m_list.insert(it, item); - msgItem->pNext = pCurr; - if (pLast) - pLast->pNext = msgItem; - if (msgItem->pNext == NULL) - m_pLastMessage = msgItem; - if (msgItem->pNext == m_pFirstMessage) - m_pFirstMessage = msgItem; - } if (pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { @@ -198,7 +153,6 @@ MsgQueueReturnCode CDVDMessageQueue::Get(CDVDMsg** pMsg, unsigned int iTimeoutIn { *pMsg = NULL; - DVDMessageListItem* msgItem; int ret = 0; if (!m_bInitialized) @@ -211,16 +165,13 @@ MsgQueueReturnCode CDVDMessageQueue::Get(CDVDMsg** pMsg, unsigned int iTimeoutIn while (!m_bAbortRequest) { - msgItem = m_pFirstMessage; - if (msgItem && msgItem->priority >= priority && !m_bCaching) + if(m_list.size() && m_list.back().priority >= priority && !m_bCaching) { - m_pFirstMessage = msgItem->pNext; + DVDMessageListItem item(m_list.back()); - if (!m_pFirstMessage) m_pLastMessage = NULL; - - if (msgItem->pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) + if (item.pMsg->IsType(CDVDMsg::DEMUXER_PACKET)) { - CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)msgItem->pMsg; + CDVDMsgDemuxerPacket* pMsgDemuxerPacket = (CDVDMsgDemuxerPacket*)item.pMsg; m_iDataSize -= pMsgDemuxerPacket->GetPacketSize(); if(m_iDataSize == 0) { @@ -232,9 +183,8 @@ MsgQueueReturnCode CDVDMessageQueue::Get(CDVDMsg** pMsg, unsigned int iTimeoutIn m_bEmptied = false; } - *pMsg = msgItem->pMsg; - - delete msgItem; // free the list item we allocated in ::Put() + *pMsg = item.pMsg; + m_list.pop_back(); ret = MSGQ_OK; break; @@ -274,12 +224,10 @@ unsigned CDVDMessageQueue::GetPacketCount(CDVDMsg::Message type) EnterCriticalSection(&m_critSection); unsigned count = 0; - DVDMessageListItem* msgItem = m_pFirstMessage; - while(msgItem) + for(SList::iterator it = m_list.begin(); it != m_list.end();it++) { - if( msgItem->pMsg->IsType(type) ) + if(it->pMsg->IsType(type)) count++; - msgItem = msgItem->pNext; } LeaveCriticalSection(&m_critSection); diff --git a/xbmc/cores/dvdplayer/DVDMessageQueue.h b/xbmc/cores/dvdplayer/DVDMessageQueue.h index a699d3278d..1fd0abe466 100644 --- a/xbmc/cores/dvdplayer/DVDMessageQueue.h +++ b/xbmc/cores/dvdplayer/DVDMessageQueue.h @@ -23,11 +23,11 @@ #include "DVDMessage.h" #include <string> +#include <list> typedef struct stDVDMessageListItem { CDVDMsg* pMsg; - struct stDVDMessageListItem *pNext; int priority; } DVDMessageListItem; @@ -79,9 +79,6 @@ private: HANDLE m_hEvent; mutable CRITICAL_SECTION m_critSection; - DVDMessageListItem* m_pFirstMessage; - DVDMessageListItem* m_pLastMessage; - bool m_bAbortRequest; bool m_bInitialized; bool m_bCaching; @@ -90,5 +87,8 @@ private: int m_iMaxDataSize; bool m_bEmptied; std::string m_owner; + + typedef std::list<DVDMessageListItem> SList; + SList m_list; }; |