[prev in list] [next in list] [prev in thread] [next in thread]
List: helix-client-cvs
Subject: [Client-cvs] medpltfm chxmedpltfm.cpp, 1.84,
From: xzhao () helixcommunity ! org
Date: 2011-05-25 3:35:08
Message-ID: 201105250335.p4P3ZLQA010641 () mailer ! progressive-comp ! com
[Download RAW message or body]
Update of /cvsroot/client/medpltfm
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv25869
Modified Files:
chxmedpltfm.cpp chxmedpltfmkicker.cpp chxmedpltfmsched.cpp
Log Message:
Add a new kicker's mechanism so change this logic to "Kick() return as its interval \
parameter the delta to the most recent event in all scheduler queue. And the Wait \
should be timed out based on that value", until it is wake up. Once it is signaled, \
re-check time delta to most recent event and adjust waiting time and then \
wait(Actually this is what we have now).
Index: chxmedpltfm.cpp
===================================================================
RCS file: /cvsroot/client/medpltfm/chxmedpltfm.cpp,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- chxmedpltfm.cpp 3 May 2011 01:07:48 -0000 1.84
+++ chxmedpltfm.cpp 25 May 2011 03:35:05 -0000 1.85
@@ -1146,7 +1146,8 @@
{
rc = m_pScheduler ? m_pScheduler->QueryInterface(riid, ppvObj) : \
HXR_NOTIMPL; }
- else if (IsEqualIID(riid, IID_IHXMediaPlatformKicker))
+ else if (IsEqualIID(riid, IID_IHXMediaPlatformKicker) ||
+ IsEqualIID(riid, IID_IHXMediaPlatformKicker2))
{
rc = m_pKicker ? m_pKicker->QueryInterface(riid, ppvObj) : HXR_NOTIMPL;
}
Index: chxmedpltfmkicker.cpp
===================================================================
RCS file: /cvsroot/client/medpltfm/chxmedpltfmkicker.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- chxmedpltfmkicker.cpp 6 May 2009 20:11:57 -0000 1.9
+++ chxmedpltfmkicker.cpp 25 May 2011 03:35:05 -0000 1.10
@@ -74,12 +74,14 @@
BEGIN_INTERFACE_LIST_NOCREATE(CHXMediaPlatformKicker)
INTERFACE_LIST_ENTRY_SIMPLE(IHXContextUser)
INTERFACE_LIST_ENTRY_SIMPLE(IHXMediaPlatformKicker)
+ INTERFACE_LIST_ENTRY_SIMPLE(IHXMediaPlatformKicker2)
END_INTERFACE_LIST
CHXMediaPlatformKicker::CHXMediaPlatformKicker(void)
:m_pSchedulerMap(NULL)
,m_pContext(NULL)
,m_pMutex(NULL)
+ ,m_pWaitEvent(NULL)
,m_bClosed(FALSE)
{
}
@@ -126,6 +128,7 @@
HX_UNLOCK(m_pMutex);
HX_RELEASE(m_pMutex);
+ HX_RELEASE(m_pWaitEvent);
HX_RELEASE(m_pContext);
return HXR_OK;
@@ -276,6 +279,19 @@
m_pContext);
}
+ if (SUCCEEDED(retVal))
+ {
+ retVal = CreateInstanceCCF(CLSID_IHXEvent,
+ (void**) &m_pWaitEvent,
+ m_pContext);
+ if (SUCCEEDED(retVal))
+ {
+ if (FAILED(m_pWaitEvent->Init("Kicker Wait Event", FALSE)))
+ {
+ HX_RELEASE(m_pWaitEvent);
+ }
+ }
+ }
return retVal;
}
STDMETHODIMP
@@ -334,4 +350,160 @@
return rc;
}
+STDMETHODIMP
+CHXMediaPlatformKicker::StartOnDemandKick(UINT32 ulThreadID)
+{
+ HX_RESULT rc = HXR_OK;
+ CHXSimpleList* pSchedulerPerThreadList = NULL;
+ CHXSimpleList::Iterator i;
+ HX_LOCK(m_pMutex);
+ if (!ulThreadID)
+ {
+ rc = HXR_INVALID_PARAMETER;
+ goto exit;
+ }
+
+ if (!m_pSchedulerMap)
+ {
+ rc = HXR_FAIL;
+ goto exit;
+ }
+
+ if (!m_pSchedulerMap->Lookup(ulThreadID, (void*&)pSchedulerPerThreadList))
+ {
+ rc = HXR_FAIL;
+ goto exit;
+ }
+
+ for (i = pSchedulerPerThreadList->Begin();
+ i != pSchedulerPerThreadList->End();
+ ++i)
+ {
+ CHXMediaPlatformScheduler* pScheduler = (CHXMediaPlatformScheduler*) (*i);
+ pScheduler->SetWaitEvent(m_pWaitEvent);
+ }
+
+exit:
+ HX_UNLOCK(m_pMutex);
+ return rc;
+}
+
+STDMETHODIMP
+CHXMediaPlatformKicker::Kick2(UINT32 ulThreadID, UINT32* pulSuggestedSleep)
+{
+ HX_RESULT rc = HXR_OK;
+ CHXSimpleList* pSchedulerPerThreadList = NULL;
+ UINT32 ulDueTime = 0, ulTmp;
+ HXBOOL bSet = FALSE;
+ CHXSimpleList::Iterator i;
+
+ HX_LOCK(m_pMutex);
+
+ if (!ulThreadID)
+ {
+ rc = HXR_INVALID_PARAMETER;
+ goto exit;
+ }
+
+ if (!m_pSchedulerMap)
+ {
+ rc = HXR_FAIL;
+ goto exit;
+ }
+
+ if (!m_pSchedulerMap->Lookup(ulThreadID, (void*&)pSchedulerPerThreadList))
+ {
+ rc = HXR_FAIL;
+ goto exit;
+ }
+
+ for (i = pSchedulerPerThreadList->Begin();
+ i != pSchedulerPerThreadList->End();
+ ++i)
+ {
+ CHXMediaPlatformScheduler* pScheduler = (CHXMediaPlatformScheduler*) (*i);
+ pScheduler->OnTimeSync(FALSE);
+
+ if (!pScheduler->IsEmpty())
+ {
+ ulTmp = pScheduler->GetCBDueTimeInMs();
+ if (ulDueTime == 0 || ulDueTime > ulTmp)
+ {
+ ulDueTime = ulTmp;
+ bSet = TRUE;
+ }
+ }
+ }
+
+ if (!bSet)
+ {
+ ulDueTime = ALLFS;
+ }
+
+ if( pulSuggestedSleep )
+ {
+ *pulSuggestedSleep = ulDueTime;
+ }
+
+exit:
+
+ HX_UNLOCK(m_pMutex);
+
+ return rc;
+}
+
+STDMETHODIMP
+CHXMediaPlatformKicker::Wait2(UINT32 ulThreadID, UINT32 ulDueTime)
+{
+ HX_RESULT rc = HXR_OK;
+ HXBOOL bSet = FALSE;
+ UINT32 ulTmp;
+ CHXSimpleList* pSchedulerPerThreadList = NULL;
+ CHXSimpleList::Iterator i;
+
+ if (!m_pSchedulerMap || !m_pSchedulerMap->Lookup(ulThreadID, \
(void*&)pSchedulerPerThreadList)) + {
+ rc = HXR_FAIL;
+ goto exit;
+ }
+
+ do
+ {
+ if (m_pWaitEvent && ulDueTime)
+ {
+ m_pWaitEvent->ResetEvent();
+ rc = m_pWaitEvent->Wait(ulDueTime);
+ }
+ if (rc == HXR_OK)
+ {
+ // Event being signaled, re-evaluate wait time
+ ulDueTime = 0;
+ bSet = FALSE;
+ HX_LOCK(m_pMutex);
+ for (i = pSchedulerPerThreadList->Begin();
+ i != pSchedulerPerThreadList->End();
+ ++i)
+ {
+ CHXMediaPlatformScheduler* pScheduler = (CHXMediaPlatformScheduler*) \
(*i); + if (!pScheduler->IsEmpty())
+ {
+ ulTmp = pScheduler->GetCBDueTimeInMs();
+ if (ulDueTime == 0 || ulDueTime > ulTmp)
+ {
+ ulDueTime = ulTmp;
+ bSet = TRUE;
+ }
+ }
+ }
+ if (!bSet)
+ {
+ ulDueTime = ALLFS;
+ }
+ HX_UNLOCK(m_pMutex);
+ }
+ } while (rc == HXR_OK && ulDueTime != 0);
+
+exit:
+ return rc;
+}
Index: chxmedpltfmsched.cpp
===================================================================
RCS file: /cvsroot/client/medpltfm/chxmedpltfmsched.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- chxmedpltfmsched.cpp 15 Sep 2010 18:59:55 -0000 1.9
+++ chxmedpltfmsched.cpp 25 May 2011 03:35:05 -0000 1.10
@@ -248,3 +248,18 @@
return retVal;
}
+HXBOOL CHXMediaPlatformScheduler::IsEmpty()
+{
+ return (m_pScheduler)? m_pScheduler->IsEmpty() : TRUE;
+}
+
+HX_RESULT
+CHXMediaPlatformScheduler::SetWaitEvent(IHXEvent* pEvent)
+{
+ return (m_pScheduler)? m_pScheduler->SetWaitEvent(pEvent) : HXR_OK;
+}
+
+UINT32 CHXMediaPlatformScheduler::GetCBDueTimeInMs()
+{
+ return (m_pScheduler)? m_pScheduler->GetCBDueTimeInMs() : 0;
+}
_______________________________________________
Client-cvs mailing list
Client-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/client-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic