[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.orgUpdate 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;