Update for thread-safety of EventDrivenThread
authorJaesung Ku <jaesung.ku@samsung.com>
Thu, 20 Jun 2013 12:02:57 +0000 (21:02 +0900)
committerJaesung Ku <jaesung.ku@samsung.com>
Thu, 20 Jun 2013 12:07:01 +0000 (21:07 +0900)
Change-Id: Iee07edacebe4a2600f4602f5045e258df9d3c24e
Signed-off-by: Jaesung Ku <jaesung.ku@samsung.com>
src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp
src/base/runtime/FBaseRt_EventDrivenThreadImpl.h

index f0ca35c..6defa58 100755 (executable)
@@ -36,8 +36,13 @@ _EventDrivenThreadImpl::_EventDrivenThreadImpl(Thread& thread, const String& nam
        , __pEventManager(null)
        , __pEvent(null)
        , __pGmainContext(null)
+       , __pLock(null)
 {
+       __pLock = new (std::nothrow) Tizen::Base::Runtime::Mutex();
+       SysTryLog(NID_BASE, __pLock != null, "Failed to allocate the mutex instance");
 
+       result r = __pLock->Create();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to create the mutex instance");
 }
 
 _EventDrivenThreadImpl::~_EventDrivenThreadImpl(void)
@@ -53,20 +58,26 @@ _EventDrivenThreadImpl::Stop(void)
 {
        result r = E_SUCCESS;
 
-       _EventDrivenThreadEventArg* pEventArg = new (std::nothrow) _EventDrivenThreadEventArg(EVENT_DRIVEN_THREAD_EVENT_TYPE_STOP
-                                                                                                                                                                                 , 0, null);
+       _EventDrivenThreadEventArg* pEventArg = new (std::nothrow) _EventDrivenThreadEventArg(EVENT_DRIVEN_THREAD_EVENT_TYPE_STOP, 0, null);
+       SysTryReturnResult(NID_BASE, pEventArg != null, E_OUT_OF_MEMORY, "Not enough memory.");
+
+       r = __pLock->Acquire();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to acquire mutex");
+
        if (__pEvent)
        {
                r = __pEvent->Fire(*pEventArg);
-               SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Failed to send a stop event", GetErrorMessage(r));
+               SysTryLog(NID_BASE_RT, !IsFailed(r), "[%s] Failed to send a stop event", GetErrorMessage(r));
        }
        else
        {
                __pendingEvents.Add(pEventArg);
        }
 
+       r = __pLock->Release();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to release mutex");
 
-       return E_SUCCESS;
+       return r;
 }
 
 Tizen::Base::Object*
@@ -75,6 +86,9 @@ _EventDrivenThreadImpl::Run(void)
        result r = E_SUCCESS;
        _EventDrivenThreadEventArg* pArg = null;
 
+       r = __pLock->Acquire();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to acquire mutex");
+
        for (int i = 0; i < __pendingEvents.GetCount(); i++)
        {
                __pendingEvents.GetAt(i, pArg);
@@ -85,6 +99,8 @@ _EventDrivenThreadImpl::Run(void)
                        continue;
                }
        }
+       r = __pLock->Release();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to release mutex");
 
        g_main_loop_run(__pGMainLoop);
 
@@ -146,7 +162,9 @@ CATCH:
 result
 _EventDrivenThreadImpl::SendUserEvent(RequestId requestId, const Tizen::Base::Collection::IList* pArgs)
 {
-       result r = E_SUCCESS;
+       result r = __pLock->Acquire();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to acquire mutex");
+
        _EventDrivenThreadEventArg* pEventArg = null;
 
        pEventArg = new (std::nothrow) _EventDrivenThreadEventArg(EVENT_DRIVEN_THREAD_EVENT_TYPE_USER_EVENT, requestId, pArgs);
@@ -159,6 +177,8 @@ _EventDrivenThreadImpl::SendUserEvent(RequestId requestId, const Tizen::Base::Co
        {
                __pendingEvents.Add(pEventArg);
        }
+       r = __pLock->Release();
+       SysTryLog(NID_BASE, !IsFailed(r), "Failed to release mutex");
 
        return r;
 }
index 9b2fbc6..694c37c 100755 (executable)
@@ -70,6 +70,7 @@ private:
        _EventDrivenThreadEvent* __pEvent;
        GMainContext* __pGmainContext;
        Tizen::Base::Collection::LinkedListT <_EventDrivenThreadEventArg*> __pendingEvents;
+       Tizen::Base::Runtime::Mutex* __pLock;
 };
 
 } } } // Tizen::Base::Runtime