aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelupus <elupus@svn>2009-12-20 15:05:25 +0000
committerelupus <elupus@svn>2009-12-20 15:05:25 +0000
commit55d558978da26d0087e7b604076d2c66580b55b8 (patch)
tree4eadc496b9519accfe2c0a6c22f8c6f36ba92013
parent902f45150aea0daeb8efb053ce22f0b90fa6a315 (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.cpp98
-rw-r--r--xbmc/cores/dvdplayer/DVDMessageQueue.h8
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;
};