diff options
author | JackLivio <jack@livio.io> | 2020-10-06 06:18:12 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-06 09:18:12 -0400 |
commit | aa4d907a0b3233f3222d86b8bfb0ce13ae994790 (patch) | |
tree | b7c09d3d001a93aa1fccdeceb7ebe3f9177b6f67 | |
parent | 91f359af3499d6b8463274c9307500b49e2a3639 (diff) | |
download | sdl_core-aa4d907a0b3233f3222d86b8bfb0ce13ae994790.tar.gz |
Bugfix 3173 (#3528)
* Fix 3173 bug:multi-thread access one pointer at same time caused a wild pointer problem in HMICapabilitiesImpl class
* modify test code for 3173
* fix Unit tests
* Fix merge conflicts
Co-authored-by: zhangwenqin <zhangwenqin@iauto.com>
4 files changed, 54 insertions, 1 deletions
diff --git a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h index 1e75499a07..0bc98827c8 100644 --- a/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h +++ b/src/components/application_manager/include/application_manager/hmi_capabilities_impl.h @@ -39,6 +39,7 @@ #include "interfaces/MOBILE_API.h" #include "json/json.h" #include "utils/macro.h" +#include "utils/rwlock.h" namespace application_manager { class ApplicationManager; @@ -485,6 +486,7 @@ class HMICapabilitiesImpl : public HMICapabilities { ApplicationManager& app_mngr_; HMILanguageHandler hmi_language_handler_; + mutable sync_primitives::RWLock hmi_capabilities_lock_; std::set<hmi_apis::FunctionID::eType> requests_required_for_capabilities_; DISALLOW_COPY_AND_ASSIGN(HMICapabilitiesImpl); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc index 81e0fa87af..e521d81ef6 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc @@ -167,6 +167,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ON_CALL(mock_allocation_manager_, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::NOT_ALLOCATED)); + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); MessageSharedPtr message_to_mobile = CreateMessage(); @@ -197,7 +199,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::IS_ALLOCATED)); MessageSharedPtr message_to_mobile = CreateMessage(); - + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); EXPECT_CALL( mock_rpc_service_, ManageMobileCommand( @@ -224,6 +227,8 @@ TEST_F(ReleaseInteriorVehicleDataModuleRequestTest, ON_CALL(mock_allocation_manager_, ReleaseResource(kModuleType, kModuleID, kAppID)) .WillByDefault(Return(ResourceReleasedState::eType::IS_RELEASED)); + ON_CALL(mock_hmi_capabilities_, rc_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); MessageSharedPtr message_to_mobile = CreateMessage(); diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc index 33771f6c3d..fab648fc95 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc @@ -217,6 +217,8 @@ class RegisterAppInterfaceRequestTest .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, display_capabilities()) .WillByDefault(Return(smart_objects::SmartObjectSPtr())); + ON_CALL(mock_hmi_capabilities_, seat_location_capability()) + .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, audio_pass_thru_capabilities()) .WillByDefault(Return(smart_objects::SmartObjectSPtr())); ON_CALL(mock_hmi_capabilities_, vehicle_type()) diff --git a/src/components/application_manager/src/hmi_capabilities_impl.cc b/src/components/application_manager/src/hmi_capabilities_impl.cc index 116732d13d..1390a3ae2c 100644 --- a/src/components/application_manager/src/hmi_capabilities_impl.cc +++ b/src/components/application_manager/src/hmi_capabilities_impl.cc @@ -131,6 +131,7 @@ HMICapabilitiesImpl::HMICapabilitiesImpl(ApplicationManager& app_mngr) HMICapabilitiesImpl::~HMICapabilitiesImpl() {} bool HMICapabilitiesImpl::VerifyImageType(const int32_t image_type) const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); auto capabilities = display_capabilities(); if (!capabilities) { return false; @@ -226,6 +227,7 @@ void HMICapabilitiesImpl::set_ui_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); ui_supported_languages_.swap(new_value); } @@ -233,6 +235,7 @@ void HMICapabilitiesImpl::set_tts_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); tts_supported_languages_.swap(new_value); } @@ -240,6 +243,7 @@ void HMICapabilitiesImpl::set_vr_supported_languages( const smart_objects::SmartObject& supported_languages) { auto new_value = std::make_shared<smart_objects::SmartObject>(supported_languages); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vr_supported_languages_.swap(new_value); } @@ -250,12 +254,14 @@ void HMICapabilitiesImpl::set_display_capabilities( display_capabilities)) { auto new_value = std::make_shared<smart_objects::SmartObject>(display_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); display_capabilities_.swap(new_value); } } void HMICapabilitiesImpl::set_system_display_capabilities( const smart_objects::SmartObject& display_capabilities) { + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); system_display_capabilities_.reset( new smart_objects::SmartObject(display_capabilities)); } @@ -264,6 +270,7 @@ void HMICapabilitiesImpl::set_hmi_zone_capabilities( const smart_objects::SmartObject& hmi_zone_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(hmi_zone_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); hmi_zone_capabilities_.swap(new_value); } @@ -271,6 +278,7 @@ void HMICapabilitiesImpl::set_soft_button_capabilities( const smart_objects::SmartObject& soft_button_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(soft_button_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); soft_buttons_capabilities_.swap(new_value); } @@ -278,6 +286,7 @@ void HMICapabilitiesImpl::set_button_capabilities( const smart_objects::SmartObject& button_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(button_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); button_capabilities_.swap(new_value); } @@ -285,6 +294,7 @@ void HMICapabilitiesImpl::set_vr_capabilities( const smart_objects::SmartObject& vr_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(vr_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vr_capabilities_.swap(new_value); } @@ -292,6 +302,7 @@ void HMICapabilitiesImpl::set_speech_capabilities( const smart_objects::SmartObject& speech_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(speech_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); speech_capabilities_.swap(new_value); } @@ -299,6 +310,7 @@ void HMICapabilitiesImpl::set_audio_pass_thru_capabilities( const smart_objects::SmartObject& audio_pass_thru_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>( audio_pass_thru_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); audio_pass_thru_capabilities_.swap(new_value); } @@ -306,6 +318,7 @@ void HMICapabilitiesImpl::set_pcm_stream_capabilities( const smart_objects::SmartObject& pcm_stream_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(pcm_stream_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); pcm_stream_capabilities_.swap(new_value); } @@ -313,12 +326,14 @@ void HMICapabilitiesImpl::set_preset_bank_capabilities( const smart_objects::SmartObject& preset_bank_capabilities) { auto new_value = std::make_shared<smart_objects::SmartObject>(preset_bank_capabilities); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); preset_bank_capabilities_.swap(new_value); } void HMICapabilitiesImpl::set_vehicle_type( const smart_objects::SmartObject& vehicle_type) { auto new_value = std::make_shared<smart_objects::SmartObject>(vehicle_type); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); vehicle_type_.swap(new_value); } @@ -326,6 +341,7 @@ void HMICapabilitiesImpl::set_prerecorded_speech( const smart_objects::SmartObject& prerecorded_speech) { auto new_value = std::make_shared<smart_objects::SmartObject>(prerecorded_speech); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); prerecorded_speech_.swap(new_value); } @@ -353,6 +369,7 @@ void HMICapabilitiesImpl::set_navigation_capability( const smart_objects::SmartObject& navigation_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(navigation_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); navigation_capability_.swap(new_value); } @@ -360,6 +377,7 @@ void HMICapabilitiesImpl::set_phone_capability( const smart_objects::SmartObject& phone_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(phone_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); phone_capability_.swap(new_value); } @@ -367,12 +385,14 @@ void HMICapabilitiesImpl::set_video_streaming_capability( const smart_objects::SmartObject& video_streaming_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(video_streaming_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); video_streaming_capability_.swap(new_value); } void HMICapabilitiesImpl::set_rc_capability( const smart_objects::SmartObject& rc_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(rc_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); rc_capability_.swap(new_value); } @@ -380,6 +400,7 @@ void HMICapabilitiesImpl::set_driver_distraction_capability( const smart_objects::SmartObject& driver_distraction_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>( driver_distraction_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); driver_distraction_capability_.swap(new_value); } @@ -387,6 +408,7 @@ void HMICapabilitiesImpl::set_seat_location_capability( const smart_objects::SmartObject& seat_location_capability) { auto new_value = std::make_shared<smart_objects::SmartObject>(seat_location_capability); + sync_primitives::AutoWriteLock lock(hmi_capabilities_lock_); seat_location_capability_.swap(new_value); } @@ -430,79 +452,95 @@ bool HMICapabilitiesImpl::is_rc_cooperating() const { const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::ui_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return ui_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vr_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vr_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::tts_supported_languages() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return tts_supported_languages_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::display_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return display_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::system_display_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return system_display_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::hmi_zone_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return hmi_zone_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::soft_button_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return soft_buttons_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::button_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return button_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::speech_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return speech_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vr_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vr_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::audio_pass_thru_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return audio_pass_thru_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::pcm_stream_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return pcm_stream_capabilities_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::preset_bank_capabilities() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return preset_bank_capabilities_; } bool HMICapabilitiesImpl::attenuated_supported() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return attenuated_supported_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::vehicle_type() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return vehicle_type_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::prerecorded_speech() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return prerecorded_speech_; } @@ -528,31 +566,37 @@ bool HMICapabilitiesImpl::driver_distraction_supported() const { const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::navigation_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return navigation_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::phone_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return phone_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::video_streaming_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return video_streaming_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::rc_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return rc_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::driver_distraction_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return driver_distraction_capability_; } const smart_objects::SmartObjectSPtr HMICapabilitiesImpl::seat_location_capability() const { + sync_primitives::AutoReadLock lock(hmi_capabilities_lock_); return seat_location_capability_; } |