From: srinivasa.mr Date: Thu, 23 May 2013 10:35:11 +0000 (+0900) Subject: Replace WorkerThread with EventDrivenThred X-Git-Tag: accepted/tizen/20131002.093600~1^2~47^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fframework%2Fnative%2Fmedia.git;a=commitdiff_plain;h=9d729049a19d763448cf0591f80dd994353c1ba3 Replace WorkerThread with EventDrivenThred If WorkerThread is deleted when in execution there will be a crash although this is a rare scenario this does happen so replace it with EventDrivenTreahd and while in desctroctor perform EventDrivenTread::Quit Change-Id: I5ebcf2481c6b83d2870b9ee69548891aa1308e0c Signed-off-by: srinivasa.mr --- diff --git a/src/FMedia_PlayerImpl.cpp b/src/FMedia_PlayerImpl.cpp index 7f446ad..2c4f93b 100644 --- a/src/FMedia_PlayerImpl.cpp +++ b/src/FMedia_PlayerImpl.cpp @@ -104,6 +104,8 @@ _PlayerImpl::~_PlayerImpl(void) __isPlayerConstructed = false; __isLocalData = true; + EventDrivenThread::Quit(); + if (__hPlayer) { ret = player_get_state(__hPlayer, &__corePlayerCurState ); @@ -218,6 +220,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, const Tizen::Graphics::Bu SysTryReturn(NID_MEDIA, __playerCount < __maxInstanceCount, E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "__playerCount count -%d failed can only create - %d Player Instances ",__playerCount, __maxInstanceCount); + r = EventDrivenThread::Construct(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Construct failed", GetErrorMessage(r)); + r = EventDrivenThread::Start(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Start failed", GetErrorMessage(r)); + // Create Event __pPlayerEvent.reset(new (std::nothrow) _PlayerEvent); SysTryCatch(NID_MEDIA, __pPlayerEvent != null , r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. __pPlayerEvent is null."); @@ -269,12 +276,6 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, const Tizen::Graphics::Bu SysTryCatch(NID_MEDIA, __hCanvas != 0, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. __hCanvas = %d", __hCanvas); } - __pEndOfStreamHandler.reset(new (std::nothrow) Thread); - SysTryReturn(NID_MEDIA, __pEndOfStreamHandler.get() != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, - "[E_OUT_OF_MEMORY]could not create memory for End of steam handling thread"); - r = __pEndOfStreamHandler->Construct(*this); - SysTryReturn(NID_MEDIA, r == E_SUCCESS, E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "[E_RESOURCE_UNAVAILABLE] Thread::Construct failed"); - __pMutex->Acquire(); SysTryLog(NID_MEDIA, r == E_SUCCESS, "[%s] Propagating.", GetErrorMessage(r)); __playerCount++; @@ -287,6 +288,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, const Tizen::Graphics::Bu return r; CATCH: + if (__hPlayer) + { + player_destroy(__hPlayer); + __hPlayer = null; + } __pPlayerEventListener = null; return r; } @@ -315,6 +321,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, IPlayerVideoEventListener SysTryReturn(NID_MEDIA, __playerCount < __maxInstanceCount, r = E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "[E_RESOURCE_UNAVAILABLE] __playerCount count -%d failed can only create - %d Player Instances ",__playerCount, __maxInstanceCount); + r = EventDrivenThread::Construct(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Construct failed", GetErrorMessage(r)); + r = EventDrivenThread::Start(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Start failed", GetErrorMessage(r)); + // Create Event __pPlayerEvent.reset(new (std::nothrow) _PlayerEvent); SysTryCatch(NID_MEDIA, __pPlayerEvent, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed. __pPlayerEvent is null."); @@ -358,12 +369,6 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, IPlayerVideoEventListener r = SetLooping(false); SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Failed to perform SetLooping operation.", GetErrorMessage(r)); - __pEndOfStreamHandler.reset(new (std::nothrow) Thread); - SysTryReturn(NID_MEDIA, __pEndOfStreamHandler.get() != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, - "[E_OUT_OF_MEMORY]could not create memory for End of steam handling thread"); - r = __pEndOfStreamHandler->Construct(*this); - SysTryReturn(NID_MEDIA, r == E_SUCCESS, E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "[E_RESOURCE_UNAVAILABLE] Thread::Construct failed"); - __pMutex->Acquire(); SysTryLog(NID_MEDIA, r == E_SUCCESS, "[%s] Propagating.", GetErrorMessage(r)); __playerCount++; @@ -376,7 +381,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, IPlayerVideoEventListener return r; CATCH: - + if (__hPlayer) + { + player_destroy(__hPlayer); + __hPlayer = null; + } __pPlayerEventListener = null; __pPlayerVideoEventListener=null; @@ -407,6 +416,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, Tizen::Graphics::Opengl:: SysTryReturn(NID_MEDIA, __playerCount < __maxInstanceCount, E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "__playerCount count -%d failed can only create - %d Player Instances ",__playerCount, __maxInstanceCount); + r = EventDrivenThread::Construct(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Construct failed", GetErrorMessage(r)); + r = EventDrivenThread::Start(); + SysTryReturn(NID_MEDIA, r == E_SUCCESS, r, r, "[%s] Thread::Start failed", GetErrorMessage(r)); + __pVideoTextureImpl = _VideoTextureImpl::GetInstance(videoTexture); SysTryReturn(NID_MEDIA, __pVideoTextureImpl != null, E_INVALID_ARG, E_INVALID_ARG, "videoTexture argument passes is wrong"); @@ -434,12 +448,6 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, Tizen::Graphics::Opengl:: r = SetLooping(false); SysTryCatch(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Propagating. Failed to perform SetLooping operation.", GetErrorMessage(r)); - __pEndOfStreamHandler.reset(new (std::nothrow) Thread); - SysTryReturn(NID_MEDIA, __pEndOfStreamHandler.get() != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, - "[E_OUT_OF_MEMORY]could not create memory for End of steam handling thread"); - r = __pEndOfStreamHandler->Construct(*this); - SysTryReturn(NID_MEDIA, r == E_SUCCESS, E_RESOURCE_UNAVAILABLE, E_RESOURCE_UNAVAILABLE, "[E_RESOURCE_UNAVAILABLE] Thread::Construct failed"); - __pMutex->Acquire(); SysTryLog(NID_MEDIA, r == E_SUCCESS, "[%s] Propagating.", GetErrorMessage(r)); __playerCount++; @@ -452,6 +460,11 @@ _PlayerImpl::Construct(IPlayerEventListener& listener, Tizen::Graphics::Opengl:: return r; CATCH: + if (__hPlayer) + { + player_destroy(__hPlayer); + __hPlayer = null; + } __pPlayerEventListener = null; return r; } @@ -1367,6 +1380,7 @@ _PlayerImpl::CreatePlayerAndSetCallBack(void) return E_SUCCESS; CATCH: player_destroy(__hPlayer); + __hPlayer = null; return r; } @@ -1652,8 +1666,8 @@ _PlayerImpl::PlayerSeekCompletedCallBack(void *pUserData) } //This is used exclusively for End of stream handling -Tizen::Base::Object* -_PlayerImpl::Run(void) +void +_PlayerImpl::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) { player_stop(__hPlayer); __currentState = PLAYER_STATE_ENDOFCLIP; @@ -1687,9 +1701,7 @@ _PlayerImpl::HandlePlayerPrepared(int errorCode) void _PlayerImpl::HandlePlayerCompleted(void) { - result r = E_SUCCESS; - r = __pEndOfStreamHandler->Start(); - SysTryReturn(NID_MEDIA, r == E_SUCCESS, , r, "[%s] Thread::Start failed", GetErrorMessage(r)); + EventDrivenThread::SendUserEvent(0, null); } void diff --git a/src/inc/FMedia_PlayerImpl.h b/src/inc/FMedia_PlayerImpl.h index 10294c5..49bc7bd 100644 --- a/src/inc/FMedia_PlayerImpl.h +++ b/src/inc/FMedia_PlayerImpl.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -52,9 +52,8 @@ class _PlayerProgressiveDownloadEvent; enum _PlayerEventType; class _OSP_EXPORT_ _PlayerImpl - : public Tizen::Base::Object - , public Tizen::Base::Runtime::ITimerEventListener - , public Tizen::Base::Runtime::IRunnable + : public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Base::Runtime::EventDrivenThread { enum Orientation { @@ -113,7 +112,7 @@ public: int GetHttpStreamingDownloadProgress(void) const; void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); - Tizen::Base::Object* Run(void); + void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); static void PlayerStartedCallBack(void *pUserData); static void PlayerCompletedCallBack(void *pUserData); @@ -169,7 +168,6 @@ private: std::unique_ptr<_PlayerProgressiveDownloadEvent> __pPlayerProgressiveDownloadEvent; std::unique_ptr __pPdTimer; std::unique_ptr __pTargetByteBuffer; - std::unique_ptr __pEndOfStreamHandler; static std::unique_ptr __pMutex; static bool __isInstanceMutexInitialized;