apply dynamic singleton pattern to internal classes and add retry code to AppWidgetMa...
[platform/framework/native/shell.git] / src / core / FShell_LockManagerImpl.cpp
index fc0c490..01ccc07 100644 (file)
@@ -52,59 +52,55 @@ enum
 };
 
 
+_LockManagerImpl* _LockManagerImpl::__pTheInstance = null;
 
-
-_LockManagerImpl::_LockManagerImpl()
+_LockManagerImpl::_LockManagerImpl(void)
 {
 }
 
-_LockManagerImpl::~_LockManagerImpl()
+_LockManagerImpl::~_LockManagerImpl(void)
 {
 }
 
-_LockManagerImpl*
-_LockManagerImpl::GetInstance()
+void
+_LockManagerImpl::InitSingleton(void)
 {
-       static _LockManagerImpl* pLockManagerImpl = null;
-       if( pLockManagerImpl == null )
-       {
-               pLockManagerImpl = new (std::nothrow) _LockManagerImpl();
-               SysTryReturn(NID_APP, pLockManagerImpl, null, E_OUT_OF_MEMORY, "The memory is insufficient.");
+       std::unique_ptr<_LockManagerImpl> pInst(new (std::nothrow) _LockManagerImpl());
+       SysTryReturnVoidResult(NID_SHELL, pInst, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
-               result r = pLockManagerImpl->Construct();
-               SysTryReturn(NID_APP, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
-       }
+       result r = pInst->Construct();
+       SysTryReturnVoidResult(NID_SHELL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
-       return pLockManagerImpl;
+       __pTheInstance = pInst.release();
+       std::atexit(DestroySingleton);
 }
 
-result
-_LockManagerImpl::Construct(void)
+void
+_LockManagerImpl::DestroySingleton(void)
 {
-       std::unique_ptr< _LockManagerProxy > pLockManagerProxy(new (std::nothrow) _LockManagerProxy);
-       SysTryReturnResult(NID_APP, pLockManagerProxy, E_OUT_OF_MEMORY, "The memory is insufficient.");
-
-       const int MAX_TRY_COUNT = 5;
-       const int TRY_SLEEP_TIME = 250;
+       delete __pTheInstance;
+}
 
-       int count = 0;
-       while (true)
+_LockManagerImpl*
+_LockManagerImpl::GetInstance(void)
+{
+       static pthread_once_t onceBlock = PTHREAD_ONCE_INIT;
+       if (__pTheInstance == null)
        {
-               result r = pLockManagerProxy->Construct();
-               if (r == E_SUCCESS)
+               ClearLastResult();
+               pthread_once(&onceBlock, InitSingleton);
+               result r = GetLastResult();
+               if (IsFailed(r))
                {
-                       SysLog(NID_APP, "Succeeded in connecting lock manager service.");
-                       break;
+                       onceBlock = PTHREAD_ONCE_INIT;
                }
-
-               SysTryReturn(NID_APP, count < MAX_TRY_COUNT, E_SYSTEM, r, "[%s] Failed to connect lock manager service.", GetErrorMessage(r));
-
-               count++;
-               Tizen::Base::Runtime::Thread::Sleep(TRY_SLEEP_TIME);
        }
+       return __pTheInstance;
+}
 
-       __pLockManager = pLockManagerProxy.release();
-
+result
+_LockManagerImpl::Construct(void)
+{
        return E_SUCCESS;
 }
 
@@ -148,7 +144,11 @@ _LockManagerImpl::Unlock(void)
        {
                return E_SUCCESS;
        }
-       return __pLockManager->Unlock();
+
+       _LockManagerProxy* pLockManagerProxy = _LockManagerProxy::GetInstance();
+       SysTryReturnResult(NID_SHELL, pLockManagerProxy, E_SYSTEM, "Failed to _LockManagerProxy::GetInstance()!");
+
+       return pLockManagerProxy->Unlock();
 }