};
+_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;
}
{
return E_SUCCESS;
}
- return __pLockManager->Unlock();
+
+ _LockManagerProxy* pLockManagerProxy = _LockManagerProxy::GetInstance();
+ SysTryReturnResult(NID_SHELL, pLockManagerProxy, E_SYSTEM, "Failed to _LockManagerProxy::GetInstance()!");
+
+ return pLockManagerProxy->Unlock();
}