summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAKalinich-Luxoft <AKalinich@luxoft.com>2017-09-14 13:16:54 +0300
committerAKalinich-Luxoft <AKalinich@luxoft.com>2017-09-18 18:59:31 +0300
commit8455aab11dd3e1f6e9828be4c6cd3a62cad9870a (patch)
treef59f106c00a5ff8722f3154d0c071f3b63e9151e
parentda4b5766ca3f1fca4caa4b4815073f72dfe37182 (diff)
downloadsdl_core-8455aab11dd3e1f6e9828be4c6cd3a62cad9870a.tar.gz
Fix SDL crash on exit/unregistering of non-RC application
SDL plugin manager is receiving notifications from application manager when any application was deactivated or unregistered. This notification will be transfered from plugin manager to RC plugin. However RC plugin processes events from any application so when it try to process event from non-RC application, SDL crashes. RC plugin should process events only from applications with RC functionality. Also there is another problem when application is unregistering its app_id() is removing from applications list in AM before OnApplicationEvent() call so when some of plugins will try to get shared_ptr using app_id, it will receive null pointer, however in AM still exists shared_ptr to this app. So it will be better to pass shared_ptr of application instead of accessing to it every time from plugins using app_id parameter. Moreover, some of plugins could require more information about application in future. Following changes were done: - Updated OnApplicationEvent() with application shared_ptr param for plugin manager and all related plugins - RC plugin now triggers OnApplicationEvent only for events from RC applications
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc3
-rw-r--r--src/components/application_manager/src/commands/hmi/on_exit_application_notification.cc2
-rw-r--r--src/components/functional_module/include/functional_module/generic_module.h7
-rw-r--r--src/components/functional_module/include/functional_module/plugin_manager.h7
-rw-r--r--src/components/functional_module/src/plugin_manager.cc19
-rw-r--r--src/components/functional_module/test/include/driver_generic_module_test.h2
-rw-r--r--src/components/remote_control/include/remote_control/remote_control_plugin.h9
-rw-r--r--src/components/remote_control/include/remote_control/resource_allocation_manager.h7
-rw-r--r--src/components/remote_control/include/remote_control/resource_allocation_manager_impl.h9
-rw-r--r--src/components/remote_control/src/remote_control_plugin.cc12
-rw-r--r--src/components/remote_control/src/resource_allocation_manager_impl.cc12
11 files changed, 54 insertions, 35 deletions
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index ab20222fcf..708f92b9fb 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -3011,7 +3011,8 @@ void ApplicationManagerImpl::UnregisterApplication(
#ifdef SDL_REMOTE_CONTROL
plugin_manager_.OnApplicationEvent(
- functional_modules::ApplicationEvent::kApplicationUnregistered, app_id);
+ functional_modules::ApplicationEvent::kApplicationUnregistered,
+ app_to_remove);
#endif
MessageHelper::SendOnAppUnregNotificationToHMI(
diff --git a/src/components/application_manager/src/commands/hmi/on_exit_application_notification.cc b/src/components/application_manager/src/commands/hmi/on_exit_application_notification.cc
index 9f4c6e5b5d..efdfaf8f3e 100644
--- a/src/components/application_manager/src/commands/hmi/on_exit_application_notification.cc
+++ b/src/components/application_manager/src/commands/hmi/on_exit_application_notification.cc
@@ -67,7 +67,7 @@ void OnExitApplicationNotification::Run() {
#ifdef SDL_REMOTE_CONTROL
application_manager_.GetPluginManager().OnApplicationEvent(
- functional_modules::ApplicationEvent::kApplicationExit, app_id);
+ functional_modules::ApplicationEvent::kApplicationExit, app_impl);
#endif // SDL_REMOTE_CONTROL
Common_ApplicationExitReason::eType reason;
diff --git a/src/components/functional_module/include/functional_module/generic_module.h b/src/components/functional_module/include/functional_module/generic_module.h
index 0c686d3501..15d572be6d 100644
--- a/src/components/functional_module/include/functional_module/generic_module.h
+++ b/src/components/functional_module/include/functional_module/generic_module.h
@@ -143,10 +143,11 @@ class GenericModule {
/**
* @brief OnApplicationEvent Processes application related events
* @param event Event
- * @param application_id Application id
+ * @param application Pointer to application struct
*/
- virtual void OnApplicationEvent(ApplicationEvent event,
- const uint32_t application_id) = 0;
+ virtual void OnApplicationEvent(
+ ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) = 0;
/**
* @brief OnPolicyEvent Processes policy related events
diff --git a/src/components/functional_module/include/functional_module/plugin_manager.h b/src/components/functional_module/include/functional_module/plugin_manager.h
index 1fb5ac9838..c573d843b2 100644
--- a/src/components/functional_module/include/functional_module/plugin_manager.h
+++ b/src/components/functional_module/include/functional_module/plugin_manager.h
@@ -130,10 +130,11 @@ class PluginManager : public ModuleObserver {
/**
* @brief OnApplicationEvent Notifies modules on certain application events
* @param event Event
- * @param application_id Application id of particular application
+ * @param application Pointer to application struct
*/
- void OnApplicationEvent(functional_modules::ApplicationEvent event,
- const uint32_t application_id);
+ void OnApplicationEvent(
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application);
/**
* @brief OnPolicyEvent Notifies modules on certain events from policy
diff --git a/src/components/functional_module/src/plugin_manager.cc b/src/components/functional_module/src/plugin_manager.cc
index b38048f843..a32fdbf773 100644
--- a/src/components/functional_module/src/plugin_manager.cc
+++ b/src/components/functional_module/src/plugin_manager.cc
@@ -351,14 +351,14 @@ typedef std::map<ModuleID, ModulePtr>::value_type PluginsValueType;
struct HandleApplicationEvent {
private:
const functional_modules::ApplicationEvent event_;
- const uint32_t app_id_;
+ application_manager::ApplicationSharedPtr application_;
public:
HandleApplicationEvent(functional_modules::ApplicationEvent e,
- const uint32_t app_id)
- : event_(e), app_id_(app_id) {}
+ application_manager::ApplicationSharedPtr application)
+ : event_(e), application_(application) {}
void operator()(PluginsValueType& p) {
- p.second->OnApplicationEvent(event_, app_id_);
+ p.second->OnApplicationEvent(event_, application_);
}
};
@@ -374,11 +374,14 @@ struct HandlePolicyEvent {
};
void PluginManager::OnApplicationEvent(
- functional_modules::ApplicationEvent event, const uint32_t application_id) {
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) {
LOG4CXX_AUTO_TRACE(logger_);
- std::for_each(plugins_.begin(),
- plugins_.end(),
- HandleApplicationEvent(event, application_id));
+ if (application) {
+ std::for_each(plugins_.begin(),
+ plugins_.end(),
+ HandleApplicationEvent(event, application));
+ }
}
void PluginManager::OnPolicyEvent(PolicyEvent event) {
diff --git a/src/components/functional_module/test/include/driver_generic_module_test.h b/src/components/functional_module/test/include/driver_generic_module_test.h
index 0d5aae1f37..23751f51c2 100644
--- a/src/components/functional_module/test/include/driver_generic_module_test.h
+++ b/src/components/functional_module/test/include/driver_generic_module_test.h
@@ -68,7 +68,7 @@ class DriverGenericModuleTest : public GenericModule {
}
void OnApplicationEvent(functional_modules::ApplicationEvent event,
- const uint32_t application_id) {}
+ application_manager::ApplicationSharedPtr app) {}
void OnPolicyEvent(functional_modules::PolicyEvent event) {}
diff --git a/src/components/remote_control/include/remote_control/remote_control_plugin.h b/src/components/remote_control/include/remote_control/remote_control_plugin.h
index 6e36470b06..1e7d49c18e 100644
--- a/src/components/remote_control/include/remote_control/remote_control_plugin.h
+++ b/src/components/remote_control/include/remote_control/remote_control_plugin.h
@@ -116,13 +116,14 @@ class RemoteControlPlugin : public RemotePluginInterface {
*/
void set_service(application_manager::ServicePtr service) OVERRIDE;
- /*
+ /**
* @brief OnApplicationEvent Processes application related events
* @param event Event
- * @param application_id Application id
+ * @param application Pointer to application struct
*/
- void OnApplicationEvent(functional_modules::ApplicationEvent event,
- const uint32_t application_id) OVERRIDE;
+ void OnApplicationEvent(
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) OVERRIDE;
/**
* @brief OnPolicyEvent Processes policy related events
diff --git a/src/components/remote_control/include/remote_control/resource_allocation_manager.h b/src/components/remote_control/include/remote_control/resource_allocation_manager.h
index e9712370d9..f789fe4af9 100644
--- a/src/components/remote_control/include/remote_control/resource_allocation_manager.h
+++ b/src/components/remote_control/include/remote_control/resource_allocation_manager.h
@@ -78,10 +78,11 @@ class ResourceAllocationManager {
/**
* @brief OnApplicationEvent Processes application related events
* @param event Event
- * @param application_id Application id
+ * @param application Pointer to application struct
*/
- virtual void OnApplicationEvent(functional_modules::ApplicationEvent event,
- const uint32_t application_id) = 0;
+ virtual void OnApplicationEvent(
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) = 0;
/**
* @brief OnPolicyEvent Processes policy related events
diff --git a/src/components/remote_control/include/remote_control/resource_allocation_manager_impl.h b/src/components/remote_control/include/remote_control/resource_allocation_manager_impl.h
index a62d1b091c..57c2a8f360 100644
--- a/src/components/remote_control/include/remote_control/resource_allocation_manager_impl.h
+++ b/src/components/remote_control/include/remote_control/resource_allocation_manager_impl.h
@@ -37,12 +37,13 @@ class ResourceAllocationManagerImpl : public ResourceAllocationManager {
const uint32_t app_id) FINAL;
/**
- * @brief OnApplicationEvent Processes application related events
+ * @brief OnApplicationEvent Notifies modules on certain application events
* @param event Event
- * @param application_id Application id
+ * @param application Pointer to application struct
*/
- void OnApplicationEvent(functional_modules::ApplicationEvent event,
- const uint32_t application_id) FINAL;
+ void OnApplicationEvent(
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) FINAL;
/**
* @brief OnPolicyEvent Processes policy related events
diff --git a/src/components/remote_control/src/remote_control_plugin.cc b/src/components/remote_control/src/remote_control_plugin.cc
index e5a073d15e..921fc3794c 100644
--- a/src/components/remote_control/src/remote_control_plugin.cc
+++ b/src/components/remote_control/src/remote_control_plugin.cc
@@ -321,9 +321,17 @@ ResourceAllocationManager& RemoteControlPlugin::resource_allocation_manager() {
}
void RemoteControlPlugin::OnApplicationEvent(
- functional_modules::ApplicationEvent event, const uint32_t application_id) {
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) {
LOG4CXX_AUTO_TRACE(logger_);
- resource_allocation_manager_.OnApplicationEvent(event, application_id);
+ if (false == service()->IsRemoteControlApplication(application)) {
+ LOG4CXX_DEBUG(logger_,
+ "Application " << application->app_id()
+ << " has no remote control functionality."
+ << " Event will be ignored for RC plugin");
+ return;
+ }
+ resource_allocation_manager_.OnApplicationEvent(event, application);
}
void RemoteControlPlugin::OnPolicyEvent(functional_modules::PolicyEvent event) {
diff --git a/src/components/remote_control/src/resource_allocation_manager_impl.cc b/src/components/remote_control/src/resource_allocation_manager_impl.cc
index fd6c2d8fb8..ecb07bb349 100644
--- a/src/components/remote_control/src/resource_allocation_manager_impl.cc
+++ b/src/components/remote_control/src/resource_allocation_manager_impl.cc
@@ -317,20 +317,22 @@ void ResourceAllocationManagerImpl::OnDriverDisallowed(
}
void ResourceAllocationManagerImpl::OnApplicationEvent(
- functional_modules::ApplicationEvent event, const uint32_t application_id) {
+ functional_modules::ApplicationEvent event,
+ application_manager::ApplicationSharedPtr application) {
LOG4CXX_AUTO_TRACE(logger_);
- LOG4CXX_DEBUG(logger_, "Event " << event << " came for " << application_id);
+ LOG4CXX_DEBUG(logger_,
+ "Event " << event << " came for " << application->app_id());
if (functional_modules::ApplicationEvent::kApplicationExit == event ||
functional_modules::ApplicationEvent::kApplicationUnregistered == event) {
- Resources acquired_modules = GetAcquiredResources(application_id);
+ Resources acquired_modules = GetAcquiredResources(application->app_id());
Resources::const_iterator module = acquired_modules.begin();
for (; acquired_modules.end() != module; ++module) {
- ReleaseResource(*module, application_id);
+ ReleaseResource(*module, application->app_id());
}
Apps app_list;
- app_list.push_back(rc_plugin_.service()->GetApplication(application_id));
+ app_list.push_back(application);
RemoveAppsSubscriptions(app_list);
}
}