diff options
author | Andrey Oleynik <aoleynik@luxoft.com> | 2016-03-09 15:59:31 +0200 |
---|---|---|
committer | Andrey Oleynik <aoleynik@luxoft.com> | 2016-03-11 13:25:34 +0200 |
commit | 5ef805732bc8944ab9f5b0fe8a46919d59de94ab (patch) | |
tree | 96a75da7d6fa2839a00afb50802bff2c35271d62 | |
parent | e76f8e79294b55a58889ca9b6f90027918e7e25d (diff) | |
download | sdl_core-5ef805732bc8944ab9f5b0fe8a46919d59de94ab.tar.gz |
Fixes issue with SDL data resetting during MASTER_RESET
There were two deadlocks during unregistering of all apps because of
MASTER_RESET:
- ApplicationManagerImpl::UnregisterAllApplications vs
ConnectionHandler::CloseSessionServices
- ApplicationManagerImpl::UnregisterApplication vs
ApplicationManagerImpl::RemoveAppFromTTSGlobalPropertiesList
That was causing reset flow blocking and data had not been cleaned up
completely.
Closes-bug: APPLINK-22117
Conflicts:
src/components/application_manager/include/application_manager/application_manager_impl.h
src/components/application_manager/src/application_manager_impl.cc
src/components/connection_handler/include/connection_handler/connection_handler_impl.h
src/components/connection_handler/src/connection_handler_impl.cc
4 files changed, 28 insertions, 13 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 f75c403899..dd9cd33fa3 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 @@ -1305,6 +1305,11 @@ class ApplicationManagerImpl : public ApplicationManager, void RemoveAppsWaitingForRegistration( const connection_handler::DeviceHandle handle); + /** + * @brief Clears TTS global properties list of apps + */ + void ClearTTSGlobalPropertiesList(); + private: /** * @brief List of applications diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc index d9d5348df7..d5f9f49e71 100644 --- a/src/components/application_manager/src/application_manager_impl.cc +++ b/src/components/application_manager/src/application_manager_impl.cc @@ -1219,7 +1219,7 @@ void ApplicationManagerImpl::SendMessageToMobile( mobile_so_factory().attachSchema(*message, false); LOG4CXX_INFO(logger_, "Attached schema to message, result if valid: " << message->isValid()); - + // Messages to mobile are not yet prioritized so use default priority value utils::SharedPtr<Message> message_to_send(new Message( protocol_handler::MessagePriority::kDefault)); @@ -2218,6 +2218,8 @@ void ApplicationManagerImpl::UnregisterAllApplications() { Compare<eType, NEQ, ALL>(unregister_reason_, IGNITION_OFF, MASTER_RESET, FACTORY_DEFAULTS); + ClearTTSGlobalPropertiesList(); + { // A local scope to limit accessor's lifetime and release app list lock. ApplicationListAccessor accessor; ApplictionSetConstIt it = accessor.begin(); @@ -3139,6 +3141,12 @@ bool ApplicationManagerImpl::IsReadWriteAllowed( return true; } +void ApplicationManagerImpl::ClearTTSGlobalPropertiesList() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(tts_global_properties_app_list_lock_); + tts_global_properties_app_list_.clear(); +} + ApplicationManagerImpl::ApplicationListAccessor::~ApplicationListAccessor() { } diff --git a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h index 8ddc6e5a53..4ead673663 100644 --- a/src/components/connection_handler/include/connection_handler/connection_handler_impl.h +++ b/src/components/connection_handler/include/connection_handler/connection_handler_impl.h @@ -51,6 +51,7 @@ #include "utils/lock.h" #include "utils/stl_utils.h" #include "utils/singleton.h" +#include "utils/rwlock.h" /** * \namespace connection_handler @@ -402,7 +403,7 @@ class ConnectionHandlerImpl : public ConnectionHandler, * @return TRUE if session and connection exist otherwise returns FALSE */ virtual bool ProtocolVersionUsed(uint32_t connection_id, - uint8_t session_id, uint8_t& protocol_version); + uint8_t session_id, uint8_t& protocol_version); private: /** * \brief Default class constructor @@ -446,7 +447,7 @@ class ConnectionHandlerImpl : public ConnectionHandler, * \brief Lock for applications list */ mutable sync_primitives::Lock connection_list_lock_; - mutable sync_primitives::Lock connection_handler_observer_lock_; + mutable sync_primitives::RWLock connection_handler_observer_lock_; /** * \brief Cleans connection list on destruction diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc index 70a50c5890..0fdb0c68bf 100644 --- a/src/components/connection_handler/src/connection_handler_impl.cc +++ b/src/components/connection_handler/src/connection_handler_impl.cc @@ -72,7 +72,7 @@ ConnectionHandlerImpl::ConnectionHandlerImpl() transport_manager_(NULL), protocol_handler_(NULL), connection_list_lock_(true), - connection_handler_observer_lock_(true), + connection_handler_observer_lock_(), connection_list_deleter_(&connection_list_) { } @@ -93,7 +93,7 @@ void ConnectionHandlerImpl::set_connection_handler_observer( ConnectionHandlerObserver *observer) { LOG4CXX_DEBUG(logger_, "ConnectionHandlerImpl::set_connection_handler_observer() " << observer); - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoWriteLock write_lock(connection_handler_observer_lock_); if (!observer) { LOG4CXX_WARN(logger_, "Set Null pointer to observer."); } @@ -124,14 +124,14 @@ void ConnectionHandlerImpl::set_protocol_handler( void ConnectionHandlerImpl::OnDeviceListUpdated( const std::vector<transport_manager::DeviceInfo>&) { LOG4CXX_AUTO_TRACE(logger_); - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->OnDeviceListUpdated(device_list_); } } void ConnectionHandlerImpl::OnFindNewApplicationsRequest() { - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->OnFindNewApplicationsRequest(); } @@ -150,7 +150,7 @@ void ConnectionHandlerImpl::OnDeviceAdded( device_info.device_handle(), Device(device_info.device_handle(), device_info.name(), device_info.mac_address(), device_info.connection_type()))); - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->OnDeviceListUpdated(device_list_); } @@ -182,7 +182,7 @@ void ConnectionHandlerImpl::OnDeviceRemoved( } device_list_.erase(device_info.device_handle()); - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->RemoveDevice(device_info.device_handle()); connection_handler_observer_->OnDeviceListUpdated(device_list_); @@ -346,7 +346,7 @@ uint32_t ConnectionHandlerImpl::OnSessionStartedCallback( *hash_id = protocol_handler::HASH_ID_NOT_SUPPORTED; } } - sync_primitives::AutoLock lock2(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { const uint32_t session_key = KeyFromPair(connection_handle, new_session_id); const bool success = connection_handler_observer_->OnServiceStartedCallback( @@ -438,7 +438,7 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback( } } - sync_primitives::AutoLock lock2(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->OnServiceEndedCallback( session_key, service_type, CloseSessionReason::kCommon); @@ -657,7 +657,7 @@ void ConnectionHandlerImpl::StartDevicesDiscovery() { return; } transport_manager_->SearchDevices(); - sync_primitives::AutoLock lock(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_) { connection_handler_observer_->OnDeviceListUpdated(device_list_); } @@ -787,6 +787,7 @@ void ConnectionHandlerImpl::CloseSession(ConnectionHandle connection_handle, } } + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (!connection_handler_observer_) { LOG4CXX_ERROR(logger_, "Connection handler observer not found"); return; @@ -923,7 +924,7 @@ void ConnectionHandlerImpl::OnConnectionEnded( connection_list_.erase(itr); connection_list_lock_.Release(); - sync_primitives::AutoLock lock2(connection_handler_observer_lock_); + sync_primitives::AutoReadLock read_lock(connection_handler_observer_lock_); if (connection_handler_observer_ && connection.get() != NULL) { const SessionMap session_map = connection->session_map(); |