fix memoryleak for WebManager
authorSeongjun Yim <se201.yim@samsung.com>
Thu, 24 Oct 2013 06:13:12 +0000 (15:13 +0900)
committerSeongjun Yim <se201.yim@samsung.com>
Thu, 24 Oct 2013 06:13:12 +0000 (15:13 +0900)
Change-Id: I8d337585389b10f04e5784653b8940cffce61db6
Signed-off-by: Seongjun Yim <se201.yim@samsung.com>
src/controls/FWebCtrl_WebManager.cpp
src/controls/FWebCtrl_WebManager.h

index e530eb4..2804ead 100755 (executable)
@@ -21,6 +21,7 @@
  *\r
  * The file contains the definition of _WebManager class.\r
  */\r
+#include <pthread.h>\r
 #include <net_connection.h>\r
 #include <FBaseSysLog.h>\r
 #include <FUiControl.h>\r
@@ -39,6 +40,10 @@ using namespace Tizen::Ui::Controls;
 namespace Tizen { namespace Web { namespace Controls\r
 {\r
 \r
+\r
+_WebManager* _WebManager::__pInstance = null;\r
+\r
+\r
 _WebManager::_WebManager(void)\r
        : __pWebList(null)\r
        , __pCallbackList(null)\r
@@ -53,39 +58,55 @@ _WebManager::~_WebManager(void)
        free(__pProxy);\r
 }\r
 \r
-_WebManager*\r
-_WebManager::GetInstance(void)\r
+\r
+void\r
+_WebManager::InitWebManager(void)\r
 {\r
        result r = E_SUCCESS;\r
-       static _WebManager* pWebMgr = null;\r
 \r
-       if (pWebMgr == null)\r
-       {\r
-               pWebMgr = new (std::nothrow) _WebManager();\r
-               SysTryReturn(NID_WEB_CTRL, pWebMgr != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] _WebManager allocation failed.");\r
+       std::unique_ptr<_WebManager> pInstance(new (std::nothrow) _WebManager());\r
+       SysTryReturnVoidResult(NID_WEB_CTRL, pInstance.get(), E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));\r
 \r
-               r = pWebMgr->Construct();\r
-               SysTryCatch(NID_WEB_CTRL, !IsFailed(r), , r, "[%s] _WebManager construction failed.", GetErrorMessage(r));\r
-       }\r
+       r = pInstance->Construct();\r
+       SysTryReturnVoidResult(NID_WEB_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));\r
 \r
-       return pWebMgr;\r
+       __pInstance = pInstance.release();\r
+       std::atexit(DestroyWebManager);\r
+}\r
 \r
-CATCH:\r
-       delete pWebMgr;\r
-       pWebMgr = null;\r
 \r
-       return null;\r
+void\r
+_WebManager::DestroyWebManager(void)\r
+{\r
+       delete __pInstance;\r
+       __pInstance = null;\r
 }\r
 \r
+\r
+_WebManager*\r
+_WebManager::GetInstance(void)\r
+{\r
+       static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;\r
+       if (__pInstance== null)\r
+       {\r
+               ClearLastResult();\r
+               pthread_once(&onceBlock, InitWebManager);\r
+               result r = GetLastResult();\r
+               if (IsFailed(r))\r
+               {\r
+                       onceBlock = PTHREAD_ONCE_INIT;\r
+               }\r
+       }\r
+\r
+       return __pInstance;\r
+}\r
+\r
+\r
 result\r
 _WebManager::Construct(void)\r
 {\r
        result r = E_SUCCESS;\r
 \r
-       int ret = -1;\r
-       connection_h handle = null;\r
-       char* pProxy = null;\r
-\r
        std::unique_ptr<ArrayListT< int> > pWebList(new (std::nothrow) ArrayListT< int >());\r
        SysTryReturnResult(NID_WEB_CTRL, pWebList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
        r = pWebList->Construct();\r
@@ -95,25 +116,41 @@ _WebManager::Construct(void)
        SysTryReturnResult(NID_WEB_CTRL, pCallbackList.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");\r
        r = pCallbackList->Construct();\r
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+\r
+       r = InitializeProxyAddress();\r
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));      \r
 
+       __pWebList = std::move(pWebList);\r
+       __pCallbackList = std::move(pCallbackList);\r
+\r
+       return E_SUCCESS;\r
+}\r
+\r
+\r
+result\r
+_WebManager::InitializeProxyAddress(void)\r
+{\r
+       int ret = -1;\r
+       connection_h handle = null;\r
+       char* pProxy = null;\r
+\r
        ret = connection_create(&handle);
        SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to create connection.");
 \r
        connection_address_family_e family = CONNECTION_ADDRESS_FAMILY_IPV4;
 
        ret = connection_get_proxy(handle, family, &pProxy);
-       SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");
-
+       SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to get proxy address.");\r
+\r
        ret = connection_destroy(handle);
        SysTryReturnResult(NID_WEB_CTRL, ret == CONNECTION_ERROR_NONE, E_SYSTEM, "A system error has been occurred. Failed to destroy connection.");\r
 \r
-       __pWebList = std::move(pWebList);\r
-       __pCallbackList = std::move(pCallbackList);\r
        __pProxy = pProxy;\r
 \r
        return E_SUCCESS;\r
 }\r
 \r
+\r
 result\r
 _WebManager::AddWeb(int webAdress)\r
 {\r
@@ -124,7 +161,6 @@ _WebManager::AddWeb(int webAdress)
        _Web* pWebCore = dynamic_cast< _Web* >(&(pImpl->GetCore()));\r
 \r
        r = pWebCore->GetEflWebkit()->SetProxyAddress(__pProxy);\r
-\r
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
 \r
        r = __pWebList->Add(webAdress);\r
@@ -133,6 +169,7 @@ _WebManager::AddWeb(int webAdress)
        return E_SUCCESS;\r
 }\r
 \r
+\r
 result\r
 _WebManager::RemoveWeb(int webAdress)\r
 {\r
@@ -141,12 +178,12 @@ _WebManager::RemoveWeb(int webAdress)
        r = __pWebList->Remove(webAdress);\r
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
 \r
-       r = __pCallbackList->Remove(webAdress);\r
-       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));\r
+       __pCallbackList->Remove(webAdress);\r
 \r
        return E_SUCCESS;\r
 }\r
 \r
+\r
 bool\r
 _WebManager::IsValidWeb(int webAdress) const\r
 {\r
@@ -165,6 +202,7 @@ _WebManager::AddCallback(int callerAdress, int callbackAdress)
        return E_SUCCESS;\r
 }\r
 \r
+\r
 result\r
 _WebManager::RemoveCallback(int callerAdress, int callbackAdress)\r
 {\r
@@ -176,6 +214,7 @@ _WebManager::RemoveCallback(int callerAdress, int callbackAdress)
        return E_SUCCESS;\r
 }\r
 \r
+\r
 bool\r
 _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const\r
 {\r
@@ -187,6 +226,7 @@ _WebManager::IsValidCallback(int callerAdress, int callbackAdress) const
        return ret;\r
 }\r
 \r
+\r
 void\r
 _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
 {\r
@@ -223,6 +263,7 @@ _WebManager::SetActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
        }\r
 }\r
 \r
+\r
 void\r
 _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)\r
 {\r
@@ -232,12 +273,14 @@ _WebManager::RemoveActiveWeb(Tizen::Web::Controls::_WebImpl* pWebAddress)
        }\r
 }\r
 \r
+\r
 void\r
 _WebManager::SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
 {\r
        __pActivePopup = pPopupAddress;\r
 }\r
 \r
+\r
 void\r
 _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)\r
 {\r
@@ -247,4 +290,5 @@ _WebManager::RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress)
        }\r
 }\r
 \r
+\r
 } } }\r
index 967a275..8cdb305 100755 (executable)
@@ -37,7 +37,7 @@ class _WebManager
        : public Tizen::Base::Object\r
 {\r
 public:\r
-       static _WebManager* GetInstance(void);\r
+       virtual ~_WebManager(void);\r
        \r
        result AddWeb(int webAdress);\r
        result RemoveWeb(int webAdress);\r
@@ -52,11 +52,18 @@ public:
        void SetActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress);\r
        void RemoveActivePopup(Tizen::Web::Controls::_WebPopup* pPopupAddress);\r
 \r
+       static _WebManager* GetInstance(void);\r
+\r
 private:\r
        _WebManager(void);\r
        _WebManager(const _WebManager& rhs);\r
-       virtual ~_WebManager(void);\r
+\r
        result Construct(void);\r
+\r
+       static void InitWebManager(void);\r
+       static void DestroyWebManager(void);\r
+       result InitializeProxyAddress(void);\r
+\r
        _WebManager& operator=(const _WebManager& rhs);\r
 \r
 private:\r
@@ -66,6 +73,8 @@ private:
        _WebImpl* __pActiveWeb;\r
        _WebPopup* __pActivePopup;\r
        char* __pProxy;\r
+\r
+       static _WebManager* __pInstance;\r
 };\r
 \r
 } } }\r