[Player-cvs] kit/android PlayerDriver.cpp, 1.10.2.7, 1.10.2.8 hxplatformobj.cpp, 1.1, 1.1.2.1 hxplatformobj.h, 1.1, 1.1.2.1

[Player-cvs] kit/android PlayerDriver.cpp, 1.10.2.7, 1.10.2.8 hxplatformobj.cpp, 1.1, 1.1.2.1 hxplatformobj.h, 1.1, 1.1.2.1

qluo at helixcommunity.org qluo at helixcommunity.org
Fri Mar 13 19:05:54 PDT 2009


Update of /cvsroot/player/kit/android
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv23686

Modified Files:
      Tag: hxclient_3_1_0_atlas
	PlayerDriver.cpp hxplatformobj.cpp hxplatformobj.h 
Log Message:
crash and leak fix.  protect media platform create/release with mutex.
use static method/member to hide HXMediaPlatformObj from caller.
CR: sfu at real.com


Index: hxplatformobj.cpp
===================================================================
RCS file: /cvsroot/player/kit/android/hxplatformobj.cpp,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -d -r1.1 -r1.1.2.1
--- hxplatformobj.cpp	12 Mar 2009 13:45:12 -0000	1.1
+++ hxplatformobj.cpp	14 Mar 2009 02:05:52 -0000	1.1.2.1
@@ -48,6 +48,7 @@
 
 #define LOG_TAG "HelixPlayer"
 #include <utils/Log.h>
+#include <utils/threads.h>
 
 #include "hxcom.h"
 #include "hxtypes.h"
@@ -64,16 +65,19 @@
 #define MAX_PATH			256
 #define CLEANUP_CALLBACK_THRESHOLD	30000
 
-extern HXMediaPlatformObj*	z_pMediaPlatformObj;
+// static variables
+HXMediaPlatformObj*	HXMediaPlatformObj::zm_pMediaPlatformObj = NULL;
+android::Mutex		HXMediaPlatformObj::zm_Lock;
+INT32			HXMediaPlatformObj::zm_lRefCount = 0;
 
 HXMediaPlatformObj::HXMediaPlatformObj()
-    : m_lRefCount(0)
-    , m_fpHXMediaPlatformOpen(NULL)
+    : m_fpHXMediaPlatformOpen(NULL)
     , m_fpHXCreateMediaPlatform(NULL)
     , m_fpHXMediaPlatformClose(NULL)
     , m_pDLLAccess(NULL)
     , m_pMediaPlatform(NULL)
     , m_pMediaPlatformKicker(NULL)
+    , m_pScheduler(NULL)
     , m_pScheduler2(NULL)
     , m_pEngineThread(NULL)
     , m_pEvent(NULL)
@@ -87,47 +91,64 @@
 
 HXMediaPlatformObj::~HXMediaPlatformObj()
 {
-    z_pMediaPlatformObj = NULL;
+    zm_pMediaPlatformObj = NULL;
     HX_DELETE(m_pEvent);
     HX_DELETE(m_pEngineThread);
     LOGI("Helix Media platform finial release: done.");
+    zm_Lock.unlock();
 }
 
-/*
- *  IUnknown methods
- */
-STDMETHODIMP
-HXMediaPlatformObj::QueryInterface(REFIID riid, void** ppvObj)
+// static methods
+HX_RESULT HXMediaPlatformObj::CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform)
 {
-    if (IsEqualIID(riid, IID_IUnknown))
+    zm_Lock.lock();
+
+    HX_RESULT retVal = HXR_OK;
+    
+    // create singleton HXMediaPlatformObj
+    if (!zm_pMediaPlatformObj)
     {
-	AddRef();
-	*ppvObj = this;
-	return HXR_OK;
+	zm_pMediaPlatformObj = new HXMediaPlatformObj();
+	if (!zm_pMediaPlatformObj)
+	{
+	    retVal = HXR_FAIL;
+	}
     }
-    else if (IsEqualIID(riid, IID_IHXCallback))
+
+    // get IHXMediaPlatform
+    if (SUCCEEDED(retVal))
     {
-	AddRef();
-	*ppvObj = (IHXCallback*)this;
-	return HXR_OK;
+	retVal = zm_pMediaPlatformObj->_CreateMediaPlatform(pMediaPlatform);
+	if (FAILED(retVal))
+	{
+	    LOGE("Can not load helix media platform.");
+	}
+	else
+	{
+	    zm_lRefCount++;
+	}
     }
+    
+    zm_Lock.unlock();
 
-    *ppvObj = NULL;
-    return HXR_NOINTERFACE;
-}
-
-STDMETHODIMP_(ULONG32) HXMediaPlatformObj::AddRef()
-{
-    return InterlockedIncrement(&m_lRefCount);
+    return retVal;
 }
 
-STDMETHODIMP_(ULONG32) HXMediaPlatformObj::Release()
+void HXMediaPlatformObj::ReleaseMediaPlatform()
 {
-    if (InterlockedDecrement(&m_lRefCount) > 0)
+    zm_lRefCount--;
+    if (zm_lRefCount > 0)
     {
-	return m_lRefCount;
+	return;
     }
+    
+    zm_pMediaPlatformObj->ScheduleShutdown();
+    
+    return;
+}
 
+void HXMediaPlatformObj::ScheduleShutdown()
+{
     // schedule finial release
     if (m_pScheduler &&
 	m_pFinalReleaseCallback && 
@@ -136,11 +157,9 @@
 	LOGI("schedule media platform finial release");
 	m_pFinalReleaseCallback->ScheduleRelative(m_pScheduler, CLEANUP_CALLBACK_THRESHOLD);
     }
-    
-    return 0;
 }
 
-HX_RESULT HXMediaPlatformObj::CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform)
+HX_RESULT HXMediaPlatformObj::_CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform)
 {
     HX_RESULT retVal = HXR_OK;
     
@@ -182,7 +201,18 @@
 
 void HXMediaPlatformObj::HandleFinalReleaseCallback(void)
 {
-    m_bTerminatePending = TRUE;
+    zm_Lock.lock();
+    if (zm_lRefCount == 0)
+    {
+	// go ahead with release
+	m_bTerminatePending = TRUE;
+    }
+    else
+    {
+	// cancel release
+	zm_Lock.lock();
+	return;
+    }
 }
 
 HX_RESULT HXMediaPlatformObj::StartEngineThread()
@@ -356,7 +386,7 @@
     }
 
     // Obtain platform scheduler's scheduler2 API
-    if (SUCCEEDED(retVal) && !m_pScheduler2)
+    if (SUCCEEDED(retVal))
     {
 	retVal = m_pMediaPlatform->QueryInterface(IID_IHXScheduler2, (void**) &m_pScheduler2);
         if (FAILED(retVal))
@@ -366,7 +396,7 @@
     }
 
     // Obtain platform scheduler's scheduler API
-    if (SUCCEEDED(retVal) && !m_pScheduler)
+    if (SUCCEEDED(retVal))
     {
 	retVal = m_pMediaPlatform->QueryInterface(IID_IHXScheduler, (void**) &m_pScheduler);
         if (FAILED(retVal))
@@ -376,7 +406,7 @@
     }
 
     // Create release callback
-    if (SUCCEEDED(retVal) && !m_pFinalReleaseCallback)
+    if (SUCCEEDED(retVal))
     {
 	m_pFinalReleaseCallback = new CHXGenericCallback((void*) this, FinalReleaseCallbackFunc);
 	if (m_pFinalReleaseCallback)
@@ -394,10 +424,6 @@
     {
         CleanupMediaPlatform();
     }
-    else
-    {
-	HX_ADDREF(m_pMediaPlatform);
-    }
 
     return retVal;
 }

Index: PlayerDriver.cpp
===================================================================
RCS file: /cvsroot/player/kit/android/PlayerDriver.cpp,v
retrieving revision 1.10.2.7
retrieving revision 1.10.2.8
diff -u -d -r1.10.2.7 -r1.10.2.8
--- PlayerDriver.cpp	12 Mar 2009 13:56:13 -0000	1.10.2.7
+++ PlayerDriver.cpp	14 Mar 2009 02:05:52 -0000	1.10.2.8
@@ -102,7 +102,6 @@
 #include "platform/unix/audAndroid.h"
 
 // Globals
-HXMediaPlatformObj*	z_pMediaPlatformObj = NULL;
 IHXPreferences*		z_pIHXPrefs = NULL;
 
 ENABLE_DLLACCESS_PATHS(g_SPlayAccessPath);
@@ -174,7 +173,6 @@
 
     IUnknown*                   m_pContext;
     IHXMediaPlatform*           m_pMediaPlatform;
-    IHXSiteEventHandler*        m_pSiteEventHandler;
     IHXScheduler*               m_pScheduler;
 
     // helix thread
@@ -209,7 +207,7 @@
     m_pClientEngine(NULL),
     m_pClientState(NULL),
     m_pMediaPlatform(NULL),
-    m_pSiteEventHandler(NULL),
+    m_pContext(NULL),
     m_pScheduler(m_pScheduler),
     m_pEvent(NULL),
     m_LastError(HXR_OK),
@@ -462,13 +460,10 @@
 
 status_t PlayerDriver::handleStart(PlayerStart* ec)
 {
-    HX_RELEASE(m_pSiteEventHandler);
-
     // for video, set thread priority so we don't hog CPU
     if (m_spSurface.get())
     {
         int ret = setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);
-        m_pMediaPlatform->QueryInterface(IID_IHXSiteEventHandler, (void**)&m_pSiteEventHandler);
     }
     // for audio, set thread priority so audio isn't choppy
     else
@@ -553,28 +548,14 @@
 {
     HX_RESULT retVal = HXR_OK;
 
-    // create singleton HXMediaPlatformObj
-    if (!z_pMediaPlatformObj)
-    {
-	z_pMediaPlatformObj = new HXMediaPlatformObj();
-	if (!z_pMediaPlatformObj)
-	{
-	    retVal = HXR_FAIL;
-	}
-    }
-
     // get IHXMediaPlatform
-    if (SUCCEEDED(retVal) && !m_pMediaPlatform)
+    if (!m_pMediaPlatform)
     {
-	retVal = z_pMediaPlatformObj->CreateMediaPlatform(m_pMediaPlatform);
+	retVal = HXMediaPlatformObj::CreateMediaPlatform(m_pMediaPlatform);
 	if (FAILED(retVal))
 	{
 	    LOGE("Can not load helix media platform.");
 	}
-	else
-	{
-	    z_pMediaPlatformObj->AddRef();
-	}
     }
 
     // Get IUnknown* context from the media platform
@@ -728,6 +709,7 @@
         HX_RELEASE(m_pCommandsProcessCallback);
     }
 
+    HX_RELEASE(m_pContext);
     HX_RELEASE(m_pScheduler);
     HX_RELEASE(m_pClientState);
     HX_RELEASE(m_pAndroidContext);
@@ -753,7 +735,7 @@
     if (m_pMediaPlatform)
     {
         HX_RELEASE(m_pMediaPlatform);
-	z_pMediaPlatformObj->Release();
+	HXMediaPlatformObj::ReleaseMediaPlatform();
     }
 }
 

Index: hxplatformobj.h
===================================================================
RCS file: /cvsroot/player/kit/android/hxplatformobj.h,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -d -r1.1 -r1.1.2.1
--- hxplatformobj.h	12 Mar 2009 13:45:12 -0000	1.1
+++ hxplatformobj.h	14 Mar 2009 02:05:52 -0000	1.1.2.1
@@ -52,21 +52,22 @@
 #include "hxthread.h"
 #include "hxcbobj.h"
 
-class HXMediaPlatformObj : public IUnknown
+class HXMediaPlatformObj
 {
 public:
     HXMediaPlatformObj();
     ~HXMediaPlatformObj();
 
-    // IUnknown methods
-    STDMETHOD(QueryInterface)	(THIS_ REFIID riid, void** ppvObj);
-    STDMETHOD_(ULONG32,AddRef)	(THIS);
-    STDMETHOD_(ULONG32,Release)	(THIS);
+    static HX_RESULT		CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform);
+    static void			ReleaseMediaPlatform();
+    static HXMediaPlatformObj*	zm_pMediaPlatformObj;
+    static INT32		zm_lRefCount;
+    static android::Mutex	zm_Lock;
 
-    HX_RESULT			CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform);
+    void			ScheduleShutdown();
 
 private:
-    INT32			m_lRefCount;
+    HX_RESULT			_CreateMediaPlatform(REF(IHXMediaPlatform*) pMediaPlatform);
 
     // entrypoints
     FPHXMEDIAPLATFORMOPEN	m_fpHXMediaPlatformOpen;




More information about the Player-cvs mailing list
 

Site Map   |   Terms of Use   |   Privacy Policy   |   Contact Us

Copyright © 1995-2007 RealNetworks, Inc. All rights reserved. RealNetworks and Helix are trademarks of RealNetworks.
All other trademarks or registered trademarks are the property of their respective holders.