[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-client-cvs
Subject:    [Client-cvs] medpltfm chxmedpltfm.cpp, 1.51.2.24,
From:       xzhao () helixcommunity ! org
Date:       2011-05-25 3:23:29
Message-ID: 201105250323.p4P3NajA010098 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/client/medpltfm
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv25464

Modified Files:
      Tag: hxclient_3_1_0_atlas
	chxmedpltfm.cpp chxmedpltfmkicker.cpp chxmedpltfmsched.cpp 
Log Message:
Add a new mechanism for Kicker, that is 
  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.51.2.24
retrieving revision 1.51.2.25
diff -u -d -r1.51.2.24 -r1.51.2.25
--- chxmedpltfm.cpp	23 Apr 2010 22:47:45 -0000	1.51.2.24
+++ chxmedpltfm.cpp	25 May 2011 03:23:26 -0000	1.51.2.25
@@ -1158,7 +1158,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.8.2.1
retrieving revision 1.8.2.2
diff -u -d -r1.8.2.1 -r1.8.2.2
--- chxmedpltfmkicker.cpp	6 May 2009 20:10:28 -0000	1.8.2.1
+++ chxmedpltfmkicker.cpp	25 May 2011 03:23:26 -0000	1.8.2.2
@@ -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.8
retrieving revision 1.8.2.1
diff -u -d -r1.8 -r1.8.2.1
--- chxmedpltfmsched.cpp	6 Jul 2007 21:58:19 -0000	1.8
+++ chxmedpltfmsched.cpp	25 May 2011 03:23:26 -0000	1.8.2.1
@@ -229,3 +229,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