From 86a49dc60bcf551c2f1138703c42c3d31a3d3314 Mon Sep 17 00:00:00 2001 From: Young Ik Cho Date: Thu, 11 Apr 2013 23:33:46 +0900 Subject: [PATCH] fix launch/terminate logic due to launch performance regression Change-Id: Iff3f6aed085c6ef1d31d457945e67c3d19855613 Signed-off-by: Young Ik Cho --- src/app/FApp_AppManagerImpl.cpp | 188 ++++++++++++++++++++++++-------------- src/app/inc/FApp_AppManagerImpl.h | 37 +++++++- 2 files changed, 155 insertions(+), 70 deletions(-) diff --git a/src/app/FApp_AppManagerImpl.cpp b/src/app/FApp_AppManagerImpl.cpp index 5aaf297..dd81a9e 100644 --- a/src/app/FApp_AppManagerImpl.cpp +++ b/src/app/FApp_AppManagerImpl.cpp @@ -232,7 +232,6 @@ _AppManagerImpl::_AppManagerImpl(void) , __eventListenerCount(0) , __pUiLibrary(null) , __pX11Library(null) - , __pAppEventList(null) { SysLog(NID_APP, ""); } @@ -310,6 +309,15 @@ _AppManagerImpl::FindAppControlN(const AppId& aId, const String& oId) AppControl* pAc = null; + /* + pAc = pRegs->GetTizenAppControlN(aId, oId); + if (pAc != null) + { + SetLastResult(E_SUCCESS); + return pAc; + } + */ + pAc = pRegs->GetNativeAppControlN(aId, oId); if (pAc != null) { @@ -831,102 +839,148 @@ _AppManagerImpl::RemoveEventListener(_IAppManagerEventListener& listener) } +/////////////////////////////////////////////////////////////////////////////// +// LifecycleManager begins. +/////////////////////////////////////////////////////////////////////////////// + void -_AppManagerImpl::AppEventCallback(app_context_h app_context, app_context_event_e event, void* pData) +_AppLifecycleManager::Init(void) { - _AppManagerImpl* pImpl = static_cast<_AppManagerImpl*>(pData); - if (pImpl == null || pImpl->__pAppEventList == null) - { - SysLogException(NID_APP, E_SYSTEM, "Wrong _AppManagerImpl state."); - return; - } + aul_listen_app_launch_signal(LaunchCallback, this); + aul_listen_app_dead_signal(TerminateCallback, this); +} - std::unique_ptr< IEnumeratorT<_IAppEventListener*> > pEnum(pImpl->__pAppEventList->GetEnumeratorN()); +void +_AppLifecycleManager::Fini(void) +{ + aul_listen_app_launch_signal(NULL, NULL); + aul_listen_app_dead_signal(NULL, NULL); +} - if (pEnum.get()) +result +_AppLifecycleManager::AddListener(_IAppEventListener& listener) +{ + if (__pEventList == null) { - char* pAppId = NULL; - app_context_get_app_id(app_context, &pAppId); - if (pAppId == NULL) - { - SysLogException(NID_APP, E_SYSTEM, "Cannot acquire appId."); - return; - } + std::unique_ptr< LinkedListT<_IAppEventListener*> > pAppEventList(new LinkedListT<_IAppEventListener*>); + SysTryReturnResult(NID_APP, pAppEventList, E_SYSTEM, "Memory allocation failed."); + + Init(); - const String appId = pAppId; + __pEventList = pAppEventList.release(); + SysLog(NID_APP, "Registered app event listener."); + } - free(pAppId); + return __pEventList->Add(&listener); +} - pid_t pid = -1; - app_context_get_pid(app_context, &pid); - const int val = event; +result +_AppLifecycleManager::RemoveListener(_IAppEventListener& listener) +{ + SysTryReturnResult(NID_APP,__pEventList != null, E_OBJ_NOT_FOUND, "_IEventListener list is empty."); - // loop unfolding - switch (val) - { - case APP_CONTEXT_EVENT_LAUNCHED: - while (pEnum->MoveNext() == E_SUCCESS) - { - _IAppEventListener* pListener = null; - pEnum->GetCurrent(pListener); + result r = __pEventList->Remove(&listener); - pListener->OnApplicationLaunched(appId, pid); - } - break; - case APP_CONTEXT_EVENT_TERMINATED: - while (pEnum->MoveNext() == E_SUCCESS) - { - _IAppEventListener* pListener = null; - pEnum->GetCurrent(pListener); + if (__pEventList->GetCount() == 0) + { + Fini(); - pListener->OnApplicationTerminated(appId, pid); - } - break; - default: - SysLog(NID_APP, "Invalid state."); - break; - } + delete __pEventList; + __pEventList = null; } - SysLog(NID_APP, "Finished invoking application event listener."); + return r; } -result -_AppManagerImpl::AddAppEventListener(_IAppEventListener& listener) +int +_AppLifecycleManager::LaunchCallback(int pid, void* pData) { - if (__pAppEventList == null) + _AppLifecycleManager* pImpl = static_cast<_AppLifecycleManager*>(pData); + if (pImpl == null || pImpl->__pEventList == null) { - std::unique_ptr< LinkedListT<_IAppEventListener*> > pAppEventList(new LinkedListT<_IAppEventListener*>); - SysTryReturnResult(NID_APP, pAppEventList, E_SYSTEM, "Memory allocation failed."); + SysLogException(NID_APP, E_SYSTEM, "Wrong _AppLifecycleImpl state."); + return -1; + } - const int ret = app_manager_set_app_context_event_cb(_AppManagerImpl::AppEventCallback, this); - SysTryReturnResult(NID_APP, ret == APP_MANAGER_ERROR_NONE, E_SYSTEM, "Context registration failed."); + char appId[255]; + int ret = aul_app_get_appid_bypid(pid, appId, sizeof(appId)); + if (ret != AUL_R_OK) + { + SysLogException(NID_APP, E_SYSTEM, "Cannot acquire appId."); + return -1; + } - __pAppEventList = pAppEventList.release(); - SysLog(NID_APP, "Registered app event listener."); + std::unique_ptr< IEnumeratorT<_IAppEventListener*> > pEnum(pImpl->__pEventList->GetEnumeratorN()); + if (pEnum.get()) + { + const String tmp = appId; + pImpl->__map.Add(pid, tmp); + + while (pEnum->MoveNext() == E_SUCCESS) + { + _IAppEventListener* pListener = null; + pEnum->GetCurrent(pListener); + + pListener->OnApplicationLaunched(tmp, pid); + } } - return __pAppEventList->Add(&listener); + SysLog(NID_APP, "Finished invoking application event listener for %s, %d.", appId, pid); + + return 0; } -result -_AppManagerImpl::RemoveAppEventListener(_IAppEventListener& listener) +int +_AppLifecycleManager::TerminateCallback(int pid, void* pData) { - result r = E_SUCCESS; - - SysTryReturnResult(NID_APP,__pAppEventList != null, E_OBJ_NOT_FOUND, "_IAppEventListener list is empty."); + _AppLifecycleManager* pImpl = static_cast<_AppLifecycleManager*>(pData); + if (pImpl == null || pImpl->__pEventList == null) + { + SysLogException(NID_APP, E_SYSTEM, "Wrong _AppLifecycleImpl state."); + return -1; + } - r = __pAppEventList->Remove(&listener); + // terminate callback cannot acquire appId from pid + String tmp; + result r = pImpl->__map.GetValue(pid, tmp); + if (r != E_SUCCESS) + { + SysLogException(NID_APP, E_SYSTEM, "Cannot acquire appId from pid %d.", pid); + return -1; + } - if (__pAppEventList->GetCount() == 0) + std::unique_ptr< IEnumeratorT<_IAppEventListener*> > pEnum(pImpl->__pEventList->GetEnumeratorN()); + if (pEnum.get()) { - app_manager_unset_app_context_event_cb(); + while (pEnum->MoveNext() == E_SUCCESS) + { + _IAppEventListener* pListener = null; + pEnum->GetCurrent(pListener); - delete __pAppEventList; - __pAppEventList = null; + pListener->OnApplicationTerminated(tmp, pid); + } } - return E_SUCCESS; + SysLog(NID_APP, "Finished invoking application event listener for %ls, %d.", tmp.GetPointer(), pid); + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// LifecycleManager ends. +/////////////////////////////////////////////////////////////////////////////// + + +result +_AppManagerImpl::AddAppEventListener(_IAppEventListener& listener) +{ + return __lifeManager.AddListener(listener); +} + +result +_AppManagerImpl::RemoveAppEventListener(_IAppEventListener& listener) +{ + return __lifeManager.RemoveListener(listener); } diff --git a/src/app/inc/FApp_AppManagerImpl.h b/src/app/inc/FApp_AppManagerImpl.h index 865a775..d39e77e 100644 --- a/src/app/inc/FApp_AppManagerImpl.h +++ b/src/app/inc/FApp_AppManagerImpl.h @@ -26,10 +26,12 @@ #include #include -#include -#include #include #include +#include +#include +#include +#include #include #include #include @@ -61,6 +63,35 @@ class _IAppManagerEventListener; class _IAppEventListener; class _AppManagerEventArg; + +class _AppLifecycleManager +{ +public: + _AppLifecycleManager(void) : __pEventList(null) + { + __map.Construct(); + } + + ~_AppLifecycleManager(void) {} + + result AddListener(_IAppEventListener& listener); + + result RemoveListener(_IAppEventListener& listener); + +private: + void Init(void); + + void Fini(void); + + static int LaunchCallback(int pid, void* pData); + + static int TerminateCallback(int pid, void* pData); + +private: + Tizen::Base::Collection::LinkedListT<_IAppEventListener*>* __pEventList; + Tizen::Base::Collection::HashMapT __map; +}; + class _OSP_EXPORT_ _AppManagerImpl : public Tizen::Base::Object , public _IAppManagerServiceEventListener @@ -374,7 +405,7 @@ private: Tizen::Base::Runtime::_LibraryImpl* __pX11Library; static Tizen::Base::Runtime::_LibraryImpl* __pEcoreXLibrary; static Tizen::Base::Runtime::_LibraryImpl* __pEcoreLibrary; - Tizen::Base::Collection::LinkedListT<_IAppEventListener*>* __pAppEventList; + _AppLifecycleManager __lifeManager; _AppManagerEvent __appManagerEvent; Tizen::Base::Collection::LinkedListT __activeAppEventListenerList; -- 2.7.4