summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAGaliuzov <AGaliuzov@luxoft.com>2015-12-03 12:12:34 +0200
committerAGaliuzov <AGaliuzov@luxoft.com>2015-12-03 12:12:34 +0200
commit4892b91a9c61e9d1fd228100aea117ca0c1b987e (patch)
tree76144a3ab5cb7fe4b972276f23d8d16ea0b721ea
parentd6120b98447ff89c1cfab05545709c9e70829347 (diff)
parentf030dd2959e0a27a04aa3150bb98172b72b89a7f (diff)
downloadsmartdevicelink-4892b91a9c61e9d1fd228100aea117ca0c1b987e.tar.gz
Merge pull request #280 from LuxoftSDL/hotfix/Fix_deadlocks_in_AM_and_log_socket_endless_blocking
Fix deadlocks in AM when stopping SDL and log socket endless blocking
-rw-r--r--src/3rd_party/apache-log4cxx-0.10.0/src/main/cpp/serversocket.cpp7
-rw-r--r--src/components/application_manager/include/application_manager/resume_ctrl.h5
-rw-r--r--src/components/application_manager/src/application_manager_impl.cc6
-rw-r--r--src/components/application_manager/src/resume_ctrl.cpp9
4 files changed, 26 insertions, 1 deletions
diff --git a/src/3rd_party/apache-log4cxx-0.10.0/src/main/cpp/serversocket.cpp b/src/3rd_party/apache-log4cxx-0.10.0/src/main/cpp/serversocket.cpp
index 095fffc54..f2b5de61c 100644
--- a/src/3rd_party/apache-log4cxx-0.10.0/src/main/cpp/serversocket.cpp
+++ b/src/3rd_party/apache-log4cxx-0.10.0/src/main/cpp/serversocket.cpp
@@ -128,6 +128,13 @@ SocketPtr ServerSocket::accept() {
throw SocketException(status);
}
+ // Added 5 seconds timeout to fix endless blocking on write() when the client is not reading
+ status = apr_socket_timeout_set(newSocket, 5000000);
+ if (status != APR_SUCCESS) {
+ apr_pool_destroy(newPool);
+ throw SocketException(status);
+ }
+
return new Socket(newSocket, newPool);
}
diff --git a/src/components/application_manager/include/application_manager/resume_ctrl.h b/src/components/application_manager/include/application_manager/resume_ctrl.h
index 99d694570..4d9031636 100644
--- a/src/components/application_manager/include/application_manager/resume_ctrl.h
+++ b/src/components/application_manager/include/application_manager/resume_ctrl.h
@@ -154,6 +154,11 @@ class ResumeCtrl: public event_engine::EventObserver {
*/
void StopSavePersistentDataTimer();
+ /**
+ * @brief Method stops restore_hmi_level_timer_ "RsmCtrlRstore" in Suspend()
+ */
+ void StopRestoreHmiLevelTimer();
+
/**
* @brief Start timer for resumption applications
* Restore D1-D5 data
diff --git a/src/components/application_manager/src/application_manager_impl.cc b/src/components/application_manager/src/application_manager_impl.cc
index 0c686c79a..baa45bc0b 100644
--- a/src/components/application_manager/src/application_manager_impl.cc
+++ b/src/components/application_manager/src/application_manager_impl.cc
@@ -2213,6 +2213,8 @@ void ApplicationManagerImpl::UnregisterAllApplications() {
bool is_unexpected_disconnect =
Compare<eType, NEQ, ALL>(unregister_reason_,
IGNITION_OFF, MASTER_RESET, FACTORY_DEFAULTS);
+
+ { // A local scope to limit accessor's lifetime and release app list lock.
ApplicationListAccessor accessor;
ApplictionSetConstIt it = accessor.begin();
while (it != accessor.end()) {
@@ -2234,7 +2236,9 @@ void ApplicationManagerImpl::UnregisterAllApplications() {
connection_handler::kCommon);
it = accessor.begin();
}
- if (is_ignition_off) {
+ }
+
+ if (is_ignition_off) { // Move this block before unregistering apps?
resume_controller().Suspend();
}
request_ctrl_.terminateAllHMIRequests();
diff --git a/src/components/application_manager/src/resume_ctrl.cpp b/src/components/application_manager/src/resume_ctrl.cpp
index 19cad8013..983699e02 100644
--- a/src/components/application_manager/src/resume_ctrl.cpp
+++ b/src/components/application_manager/src/resume_ctrl.cpp
@@ -376,6 +376,7 @@ bool ResumeCtrl::RemoveApplicationFromSaved(const std::string& mobile_app_id) {
void ResumeCtrl::Suspend() {
LOG4CXX_AUTO_TRACE(logger_);
+ StopRestoreHmiLevelTimer();
StopSavePersistentDataTimer();
SaveAllApplications();
Json::Value to_save;
@@ -443,6 +444,14 @@ void ResumeCtrl::StopSavePersistentDataTimer() {
}
+void ResumeCtrl::StopRestoreHmiLevelTimer() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (restore_hmi_level_timer_.isRunning()) {
+ restore_hmi_level_timer_.stop();
+ }
+}
+
+
bool ResumeCtrl::StartResumption(ApplicationSharedPtr application,
const std::string& hash) {
LOG4CXX_AUTO_TRACE(logger_);