[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