Replace WorkerThread with EventDrivenThred
authorsrinivasa.mr <srinivasa.mr@samsung.com>
Thu, 23 May 2013 10:35:11 +0000 (19:35 +0900)
committersrinivasa.mr <srinivasa.mr@samsung.com>
Thu, 23 May 2013 10:37:14 +0000 (19:37 +0900)
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 <srinivasa.mr@samsung.com>
src/FMedia_PlayerImpl.cpp
src/inc/FMedia_PlayerImpl.h

index 7f446ad..2c4f93b 100644 (file)
@@ -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
index 10294c5..49bc7bd 100644 (file)
@@ -29,7 +29,7 @@
 #include <player.h>
 #include <FOspConfig.h>
 #include <FBaseRtTimer.h>
-#include <FBaseRtThread.h>
+#include <FBaseRtEventDrivenThread.h>
 #include <FGrp_BufferInfoImpl.h>
 #include <FGrp_VideoTextureImpl.h>
 #include <FMediaPlayerTypes.h>
@@ -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<Tizen::Base::Runtime::Timer> __pPdTimer;
        std::unique_ptr<Tizen::Base::ByteBuffer> __pTargetByteBuffer;
-       std::unique_ptr<Tizen::Base::Runtime::Thread> __pEndOfStreamHandler;
        static std::unique_ptr<Tizen::Base::Runtime::Mutex> __pMutex;
        static bool __isInstanceMutexInitialized;