summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackLivio <jack@livio.io>2020-10-06 06:18:12 -0700
committerGitHub <noreply@github.com>2020-10-06 09:18:12 -0400
commitaa4d907a0b3233f3222d86b8bfb0ce13ae994790 (patch)
treeb7c09d3d001a93aa1fccdeceb7ebe3f9177b6f67
parent91f359af3499d6b8463274c9307500b49e2a3639 (diff)
downloadsdl_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>
-rw-r--r--src/components/application_manager/include/application_manager/hmi_capabilities_impl.h2
-rw-r--r--src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/commands/release_interior_vehicle_data_module_request_test.cc7
-rw-r--r--src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/register_app_interface_request_test.cc2
-rw-r--r--src/components/application_manager/src/hmi_capabilities_impl.cc44
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_;
}