From 442442245b651cb07883426d2723b28c8dde443f Mon Sep 17 00:00:00 2001 From: Hyunbin Lee Date: Tue, 26 Nov 2013 10:35:41 +0900 Subject: [PATCH] Modify DataControl manager for thread-safe Change-Id: I5af181e550756079d240301c005a32353c0a723e Signed-off-by: Hyunbin Lee --- src/app/FApp_DataControlManager.cpp | 45 ++++++++++++++++++++++++++++++++----- src/app/FApp_DataControlManager.h | 4 ++++ src/app/FApp_SqlDataControlImpl.cpp | 9 +++++--- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/app/FApp_DataControlManager.cpp b/src/app/FApp_DataControlManager.cpp index 02a33d8..25d3bd9 100644 --- a/src/app/FApp_DataControlManager.cpp +++ b/src/app/FApp_DataControlManager.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ using namespace std; using namespace Tizen::Base; using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; using namespace Tizen::App::Package; namespace Tizen { namespace App @@ -50,12 +52,27 @@ _DataControlManager::_DataControlManager(void) , __pProviderList(null) , __uniqueId(-1) { - __pDataControlRequestList = new (std::nothrow) HashMap(SingleObjectDeleter); - SysTryReturnVoidResult(NID_APP, __pDataControlRequestList != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); - __pDataControlRequestList->Construct(); +} + +result +_DataControlManager::Construct(void) +{ + unique_ptr< HashMap > pDataControlRequestList(new (std::nothrow) HashMap(SingleObjectDeleter)); + SysTryReturnResult(NID_APP, pDataControlRequestList != null, E_OUT_OF_MEMORY, "The memory is insufficient."); + + result r = pDataControlRequestList->Construct(); + SysTryReturnResult(NID_APP, !IsFailed(r), r, "Propagating to caller..."); - __pProviderList = new (std::nothrow) LinkedList(SingleObjectDeleter); - SysTryReturnVoidResult(NID_APP, __pProviderList != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); + unique_ptr< LinkedList > pProviderList(new (std::nothrow) LinkedList(SingleObjectDeleter)); + SysTryReturnResult(NID_APP, pProviderList != null, E_OUT_OF_MEMORY, "The memory is insufficient."); + + r = __mutex.Create(); + SysTryReturnResult(NID_APP, !IsFailed(r), r, "Mutex initialization failed."); + + __pDataControlRequestList = pDataControlRequestList.release(); + __pProviderList = pProviderList.release(); + + return E_SUCCESS; } _DataControlManager::~_DataControlManager(void) @@ -70,10 +87,16 @@ _DataControlManager::InitSingleton(void) _DataControlManager* pInst = new (std::nothrow) _DataControlManager(); SysTryReturnVoidResult(NID_APP, pInst != null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); + result r = pInst->Construct(); + SysTryCatch(NID_IO, !IsFailed(r), , r, "[%s] Propagating to caller...", GetErrorMessage(r)); + __pDataControlManagerInstance = pInst; - + std::atexit(DestroySingleton); return; + +CATCH: + delete pInst; } void @@ -105,6 +128,8 @@ _DataControlManager::GetInstance(void) int _DataControlManager::GetRequestCount(void) const { + MutexGuard lock(__mutex); + return __pDataControlRequestList->GetCount(); } @@ -112,6 +137,8 @@ result _DataControlManager::AddRequestInfo(Integer* pReqId, _DataControlRequestInfo* pReqInfo) { //SysLog(NID_APP, "DataControl request list count: %d", __pDataControlRequestList->GetCount()); + MutexGuard lock(__mutex); + return __pDataControlRequestList->Add(pReqId, pReqInfo); } @@ -120,6 +147,8 @@ _DataControlManager::GetRequestInfo(Integer& reqId) { result r = E_SUCCESS; + MutexGuard lock(__mutex); + Object* pObj = __pDataControlRequestList->GetValue(reqId); SysTryReturn(NID_APP, pObj != null, null, GetLastResult(), "[%s] Propagating to caller...", GetErrorMessage(GetLastResult())); @@ -132,12 +161,16 @@ _DataControlManager::GetRequestInfo(Integer& reqId) void _DataControlManager::RemoveRequestInfo(Integer& reqId) { + MutexGuard lock(__mutex); + __pDataControlRequestList->Remove(reqId); } void _DataControlManager::RemoveAllRequests(void) { + MutexGuard lock(__mutex); + __pDataControlRequestList->RemoveAll(); } diff --git a/src/app/FApp_DataControlManager.h b/src/app/FApp_DataControlManager.h index ca29cb6..cc3ca95 100644 --- a/src/app/FApp_DataControlManager.h +++ b/src/app/FApp_DataControlManager.h @@ -26,6 +26,7 @@ #include #include #include +#include #include namespace Tizen { namespace App @@ -107,6 +108,8 @@ public: private: _DataControlManager(void); + result Construct(void); + virtual ~_DataControlManager(void); void Cache(const AppId& appId); @@ -122,6 +125,7 @@ private: Tizen::Base::Collection::HashMap* __pDataControlRequestList; Tizen::Base::Collection::LinkedList* __pProviderList; int __uniqueId; + mutable Tizen::Base::Runtime::Mutex __mutex; }; // _DataControlManager diff --git a/src/app/FApp_SqlDataControlImpl.cpp b/src/app/FApp_SqlDataControlImpl.cpp index 4c95acd..ce5e2c5 100644 --- a/src/app/FApp_SqlDataControlImpl.cpp +++ b/src/app/FApp_SqlDataControlImpl.cpp @@ -160,7 +160,7 @@ _SqlDataControlImpl::~_SqlDataControlImpl(void) while (pEnum->MoveNext() == E_SUCCESS) { Integer* pReqId = dynamic_cast< Integer* >(pEnum->GetCurrent()); - if (pReqId != null) + if (pReqId != null && pDcMgr != null) { pDcMgr->RemoveRequestInfo(*pReqId); } @@ -189,6 +189,7 @@ _SqlDataControlImpl::StartSqlDataControl(int type, const IList* pDataList, int* int req = -1; _DataControlManager* pDcMgr = _DataControlManager::GetInstance(); + SysTryReturnResult(NID_APP, pDcMgr != null, E_SYSTEM, "Getting _DataControlManager instance failed."); // Check the request count of DataControl operation int count = pDcMgr->GetRequestCount(); @@ -396,6 +397,8 @@ _SqlDataControlImpl::SqlDataControlCallback(void* data, _AppArg* pArg, _AppArg* Integer key(reqId); _DataControlManager* pDcMgr = static_cast< _DataControlManager* >(data); + SysTryReturnResult(NID_APP, pDcMgr != null, E_SYSTEM, "Getting _DataControlManager instance failed."); + _DataControlRequestInfo* pReqInfo = pDcMgr->GetRequestInfo(key); if (pReqInfo == null) { @@ -585,7 +588,7 @@ _SqlDataControlImpl::Insert(const String& dataId, const IMap& insertMap, Request tmpPath.Append(App::GetInstance()->GetAppId()); _DataControlManager* pDcMgr = _DataControlManager::GetInstance(); - SysTryCatch(NID_APP, pDcMgr, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get _DataControlManager instance."); + SysTryCatch(NID_APP, pDcMgr != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Getting _DataControlManager instance failed."); uniqueId = pDcMgr->GetUniqueId(); tmpPath.Append(uniqueId); @@ -723,7 +726,7 @@ _SqlDataControlImpl::Update(const String& dataId, const IMap& updateMap, const S tmpPath.Append(App::GetInstance()->GetAppId()); _DataControlManager* pDcMgr = _DataControlManager::GetInstance(); - SysTryCatch(NID_APP, pDcMgr, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to get _DataControlManager instance."); + SysTryCatch(NID_APP, pDcMgr != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Getting _DataControlManager instance failed."); uniqueId = pDcMgr->GetUniqueId(); tmpPath.Append(uniqueId); -- 2.7.4