Modify DataControl manager for thread-safe 77/14077/1
authorHyunbin Lee <hyunbin.lee@samsung.com>
Tue, 26 Nov 2013 01:35:41 +0000 (10:35 +0900)
committerHyunbin Lee <hyunbin.lee@samsung.com>
Mon, 23 Dec 2013 06:33:02 +0000 (15:33 +0900)
Change-Id: I5af181e550756079d240301c005a32353c0a723e
Signed-off-by: Hyunbin Lee <hyunbin.lee@samsung.com>
src/app/FApp_DataControlManager.cpp
src/app/FApp_DataControlManager.h
src/app/FApp_SqlDataControlImpl.cpp

index 02a33d8..25d3bd9 100644 (file)
@@ -30,6 +30,7 @@
 #include <FBaseInteger.h>
 #include <FBaseSysLog.h>
 #include <FBaseColIEnumerator.h>
+#include <FBaseRtMutexGuard.h>
 
 #include <FBase_StringConverter.h>
 #include <FAppPkg_PackageManagerImpl.h>
@@ -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();
 }
 
index ca29cb6..cc3ca95 100644 (file)
@@ -26,6 +26,7 @@
 #include <FBaseColHashMap.h>
 #include <FBaseColLinkedList.h>
 #include <FBaseRtEvent.h>
+#include <FBaseRtMutex.h>
 #include <FAppTypes.h>
 
 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
 
index 4c95acd..ce5e2c5 100644 (file)
@@ -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);