summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Gapchuk <igapchuck@luxoft.com>2019-11-11 10:20:44 +0200
committerIgor Gapchuk <igapchuck@luxoft.com>2019-11-11 10:20:44 +0200
commit82f304f767cd35edefc53912fd1c2ce895640f78 (patch)
tree084b42c699746507b0b9fd3f5456595a6d2109a9
parent4d283e625dfa09d166d572fa7bf6e98e91f05050 (diff)
downloadsdl_core-fix/sdl_crash_during_app_registration.tar.gz
Fix SDL crash during application registrationfix/sdl_crash_during_app_registration
-rw-r--r--src/components/application_manager/include/application_manager/application_manager_impl.h21
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc5
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc1
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc13
-rw-r--r--src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc1
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc52
-rw-r--r--src/components/application_manager/test/application_manager_impl_test.cc7
-rw-r--r--src/components/include/application_manager/application_manager.h3
-rw-r--r--src/components/include/test/application_manager/mock_application_manager.h4
10 files changed, 94 insertions, 14 deletions
diff --git a/src/components/application_manager/include/application_manager/application_manager_impl.h b/src/components/application_manager/include/application_manager/application_manager_impl.h
index e88c954c18..d17a32261c 100644
--- a/src/components/application_manager/include/application_manager/application_manager_impl.h
+++ b/src/components/application_manager/include/application_manager/application_manager_impl.h
@@ -1136,8 +1136,29 @@ class ApplicationManagerImpl
*/
protocol_handler::MajorProtocolVersion SupportedSDLVersion() const OVERRIDE;
+ /**
+ * @brief Applies functor for each plugin
+ * @param functor Functor that will be applied to each plugin
+ */
+ void ForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) OVERRIDE;
+
private:
/**
+ * @brief Adds application to registered applications list and marks it as
+ * registered
+ * @param application Application taht should be added to registered
+ * applications list.
+ */
+ void AddAppToRegisteredAppList(ApplicationSharedPtr application);
+
+ /**
+ * @brief Adds all extensions to applications
+ * @param application Application to which will be added extensions
+ */
+ void AddExtensionsToApp(ApplicationSharedPtr application);
+
+ /**
* @brief Removes service status record for service that failed to start
* @param app Application whose service status record should be removed
* @param Service type which status record should be removed
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
index ca0edc90b1..f344dd15a7 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_helpers.cc
@@ -175,6 +175,7 @@ const std::vector<std::string> RCHelpers::GetModuleTypesList() {
RCAppExtensionPtr RCHelpers::GetRCExtension(
application_manager::Application& app) {
+ LOG4CXX_AUTO_TRACE(logger_);
auto extension_interface = app.QueryInterface(RCRPCPlugin::kRCPluginID);
auto extension =
std::static_pointer_cast<RCAppExtension>(extension_interface);
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
index 9005eb7fd0..a3c8d5afd8 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/rc_rpc_plugin.cc
@@ -107,7 +107,12 @@ void RCRPCPlugin::OnPolicyEvent(
void RCRPCPlugin::OnApplicationEvent(
application_manager::plugin_manager::ApplicationEvent event,
application_manager::ApplicationSharedPtr application) {
+ LOG4CXX_AUTO_TRACE(logger_);
if (!application->is_remote_control_supported()) {
+ LOG4CXX_DEBUG(
+ logger_,
+ "Remote control is not supported for application with app_id: "
+ << application->app_id());
return;
}
switch (event) {
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
index 97ff2b23da..049f9a3cf3 100644
--- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
+++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/src/resource_allocation_manager_impl.cc
@@ -156,6 +156,7 @@ bool ResourceAllocationManagerImpl::IsUserLocationValid(
ModuleUid& module, application_manager::ApplicationSharedPtr app) {
LOG4CXX_AUTO_TRACE(logger_);
const auto extension = RCHelpers::GetRCExtension(*app);
+ DCHECK_OR_RETURN(extension, false);
const auto user_location = extension->GetUserLocation();
const auto module_service_area =
rc_capabilities_manager_.GetModuleServiceArea(module);
diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
index 14a94fd1a2..f152742064 100644
--- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
+++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/register_app_interface_request.cc
@@ -43,6 +43,7 @@
#include "application_manager/application_manager.h"
#include "application_manager/helpers/application_helper.h"
#include "application_manager/message_helper.h"
+#include "application_manager/plugin_manager/plugin_keys.h"
#include "application_manager/policies/policy_handler.h"
#include "application_manager/policies/policy_handler_interface.h"
#include "application_manager/resumption/resume_ctrl.h"
@@ -875,6 +876,18 @@ void RegisterAppInterfaceRequest::SendRegisterAppInterfaceResponseToMobile(
// Default HMI level should be set before any permissions validation, since it
// relies on HMI level.
application_manager_.OnApplicationRegistered(application);
+
+ if (application->is_remote_control_supported()) {
+ auto add_rc_extension = [application](plugin_manager::RPCPlugin& plugin) {
+ if (plugin.PluginName() ==
+ application_manager::plugin_manager::plugin_names::rc_rpc_plugin) {
+ plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered,
+ application);
+ }
+ };
+ application_manager_.ForEachPlugin(add_rc_extension);
+ }
+
SendOnAppRegisteredNotificationToHMI(
application, resumption, need_restore_vr);
(*notify_upd_manager)();
diff --git a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
index 40da7501c1..3017b6712f 100644
--- a/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
+++ b/src/components/application_manager/rpc_plugins/vehicle_info_plugin/src/vehicle_info_plugin.cc
@@ -98,6 +98,7 @@ void VehicleInfoPlugin::OnApplicationEvent(
}
void VehicleInfoPlugin::UnsubscribeFromRemovedVDItems() {
+ LOG4CXX_AUTO_TRACE(logger_);
typedef std::vector<std::string> StringsVector;
auto get_items_to_unsubscribe = [this]() -> StringsVector {
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 8044e8b6cd..75b9b855dc 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -434,12 +434,6 @@ void ApplicationManagerImpl::OnApplicationRegistered(ApplicationSharedPtr app) {
sync_primitives::AutoLock lock(applications_list_lock_ptr_);
const mobile_apis::HMILevel::eType default_level = GetDefaultHmiLevel(app);
state_ctrl_.OnApplicationRegistered(app, default_level);
-
- std::function<void(plugin_manager::RPCPlugin&)> on_app_registered =
- [app](plugin_manager::RPCPlugin& plugin) {
- plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered, app);
- };
- plugin_manager_->ForEachPlugin(on_app_registered);
}
void ApplicationManagerImpl::OnApplicationSwitched(ApplicationSharedPtr app) {
@@ -729,14 +723,8 @@ ApplicationSharedPtr ApplicationManagerImpl::RegisterApplication(
// Timer will be started after hmi level resumption.
resume_controller().OnAppRegistrationStart(policy_app_id, device_mac);
- // Add application to registered app list and set appropriate mark.
- // Lock has to be released before adding app to policy DB to avoid possible
- // deadlock with simultaneous PTU processing
- applications_list_lock_ptr_->Acquire();
- application->MarkRegistered();
- applications_.insert(application);
- apps_size_ = applications_.size();
- applications_list_lock_ptr_->Release();
+ AddAppToRegisteredAppList(application);
+ AddExtensionsToApp(application);
// Update cloud app information, in case any pending apps are unable to be
// registered due to a mobile app taking precedence
@@ -4176,6 +4164,42 @@ ApplicationManagerImpl::SupportedSDLVersion() const {
get_settings().max_supported_protocol_version());
}
+void ApplicationManagerImpl::AddAppToRegisteredAppList(
+ ApplicationSharedPtr application) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(application);
+ sync_primitives::AutoLock lock(applications_list_lock_ptr_);
+
+ // Add application to registered app list and set appropriate mark.
+ application->MarkRegistered();
+ applications_.insert(application);
+ LOG4CXX_DEBUG(
+ logger_,
+ "App with app_id: " << application->app_id()
+ << " has been added to registered applications list");
+ apps_size_ = static_cast<uint32_t>(applications_.size());
+}
+
+void ApplicationManagerImpl::AddExtensionsToApp(
+ ApplicationSharedPtr application) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ DCHECK_OR_RETURN_VOID(application);
+ sync_primitives::AutoLock lock(applications_list_lock_ptr_);
+
+ std::function<void(plugin_manager::RPCPlugin&)> on_app_registered =
+ [application](plugin_manager::RPCPlugin& plugin) {
+ plugin.OnApplicationEvent(plugin_manager::kApplicationRegistered,
+ application);
+ };
+ plugin_manager_->ForEachPlugin(on_app_registered);
+}
+
+void ApplicationManagerImpl::ForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ plugin_manager_->ForEachPlugin(functor);
+}
+
event_engine::EventDispatcher& ApplicationManagerImpl::event_dispatcher() {
return event_dispatcher_;
}
diff --git a/src/components/application_manager/test/application_manager_impl_test.cc b/src/components/application_manager/test/application_manager_impl_test.cc
index 152d577cda..aa82c6b86b 100644
--- a/src/components/application_manager/test/application_manager_impl_test.cc
+++ b/src/components/application_manager/test/application_manager_impl_test.cc
@@ -90,6 +90,7 @@ using ::testing::SaveArg;
using ::testing::SetArgPointee;
using ::testing::SetArgReferee;
+using application_manager::plugin_manager::MockRPCPluginManager;
using test::components::application_manager_test::MockStateController;
using test::components::policy_test::MockPolicyHandlerInterface;
@@ -1607,6 +1608,9 @@ TEST_F(ApplicationManagerImplTest,
smart_objects::SmartObjectSPtr request_for_registration_ptr =
std::make_shared<smart_objects::SmartObject>(request_for_registration);
+ std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager(
+ new MockRPCPluginManager());
+ app_manager_impl_->SetPluginManager(rpc_plugin_manager);
ApplicationSharedPtr application =
app_manager_impl_->RegisterApplication(request_for_registration_ptr);
EXPECT_STREQ(kAppName.c_str(), application->name().c_str());
@@ -1774,6 +1778,9 @@ TEST_F(ApplicationManagerImplTest,
smart_objects::SmartObjectSPtr request_for_registration_ptr =
std::make_shared<smart_objects::SmartObject>(request_for_registration);
+ std::unique_ptr<plugin_manager::RPCPluginManager> rpc_plugin_manager(
+ new MockRPCPluginManager());
+ app_manager_impl_->SetPluginManager(rpc_plugin_manager);
ApplicationSharedPtr application =
app_manager_impl_->RegisterApplication(request_for_registration_ptr);
diff --git a/src/components/include/application_manager/application_manager.h b/src/components/include/application_manager/application_manager.h
index fa2e8941b8..23e6a44395 100644
--- a/src/components/include/application_manager/application_manager.h
+++ b/src/components/include/application_manager/application_manager.h
@@ -664,6 +664,9 @@ class ApplicationManager {
virtual protocol_handler::MajorProtocolVersion SupportedSDLVersion()
const = 0;
+ virtual void ForEachPlugin(
+ std::function<void(plugin_manager::RPCPlugin&)> functor) = 0;
+
/*
* @brief Converts connection string transport type representation
* to HMI Common_TransportType
diff --git a/src/components/include/test/application_manager/mock_application_manager.h b/src/components/include/test/application_manager/mock_application_manager.h
index e533228656..abb3d9a882 100644
--- a/src/components/include/test/application_manager/mock_application_manager.h
+++ b/src/components/include/test/application_manager/mock_application_manager.h
@@ -269,6 +269,10 @@ class MockApplicationManager : public application_manager::ApplicationManager {
MOCK_CONST_METHOD0(SupportedSDLVersion,
protocol_handler::MajorProtocolVersion());
MOCK_METHOD1(
+ ForEachPlugin,
+ void(std::function<void(application_manager::plugin_manager::RPCPlugin&)>
+ functor));
+ MOCK_METHOD1(
GetDeviceTransportType,
hmi_apis::Common_TransportType::eType(const std::string& transport_type));
MOCK_METHOD1(AddAppToTTSGlobalPropertiesList, void(const uint32_t app_id));