From 4a95e99117416e4aa74bfa4ff89ee47f720a30e3 Mon Sep 17 00:00:00 2001 From: Jaesung Ku Date: Thu, 20 Jun 2013 21:02:57 +0900 Subject: [PATCH] Update for thread-safety of EventDrivenThread Change-Id: Iee07edacebe4a2600f4602f5045e258df9d3c24e Signed-off-by: Jaesung Ku --- src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp | 30 ++++++++++++++++++---- src/base/runtime/FBaseRt_EventDrivenThreadImpl.h | 1 + 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp b/src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp index f0ca35c..6defa58 100755 --- a/src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp +++ b/src/base/runtime/FBaseRt_EventDrivenThreadImpl.cpp @@ -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; } diff --git a/src/base/runtime/FBaseRt_EventDrivenThreadImpl.h b/src/base/runtime/FBaseRt_EventDrivenThreadImpl.h index 9b2fbc6..694c37c 100755 --- a/src/base/runtime/FBaseRt_EventDrivenThreadImpl.h +++ b/src/base/runtime/FBaseRt_EventDrivenThreadImpl.h @@ -70,6 +70,7 @@ private: _EventDrivenThreadEvent* __pEvent; GMainContext* __pGmainContext; Tizen::Base::Collection::LinkedListT <_EventDrivenThreadEventArg*> __pendingEvents; + Tizen::Base::Runtime::Mutex* __pLock; }; } } } // Tizen::Base::Runtime -- 2.7.4