summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kutsan (GitHub) <akutsan@luxoft.com>2020-09-02 17:48:59 +0300
committerGitHub <noreply@github.com>2020-09-02 10:48:59 -0400
commit3b4e2541c6d494d1b637bd62a7d9d577d306f3e3 (patch)
tree573f674ebb787cd4da477d44586e12c3195b501c
parent062d3b0f2a6eb2185d14dc80a885cdfe4860ce23 (diff)
downloadsdl_core-3b4e2541c6d494d1b637bd62a7d9d577d306f3e3.tar.gz
App not Un-Registering when trying to Force Close Nav App (#3374)
* SYNC-62924: App not Un-Registering when trying to Force Close Nav App SYNC-62924 1. video_streaming_Lock acquired was not released when timeout and stop called from another thread happens at the same time 2. resumption timeout callback was waiting on Policy_Manager_lock_ which was not released, when acquired if resuming application is activated. 3. Crash observered when one thread accessing multiframe data and other thread deleting the mutliframe data due to disconnection Co-authored-by: asanka17 <asanka17@ford.com> Co-authored-by: YarikMamykin <ymamykin@luxoft.com> Co-authored-by: LitvinenkoIra <ilytvynenko@luxoft.com>
-rw-r--r--src/components/application_manager/src/policies/policy_handler.cc1
-rw-r--r--src/components/include/utils/rwlock.h34
-rw-r--r--src/components/protocol_handler/include/protocol_handler/multiframe_builder.h2
-rw-r--r--src/components/protocol_handler/src/multiframe_builder.cc6
4 files changed, 42 insertions, 1 deletions
diff --git a/src/components/application_manager/src/policies/policy_handler.cc b/src/components/application_manager/src/policies/policy_handler.cc
index 0323e82e45..51dde38a0e 100644
--- a/src/components/application_manager/src/policies/policy_handler.cc
+++ b/src/components/application_manager/src/policies/policy_handler.cc
@@ -1447,6 +1447,7 @@ void PolicyHandler::OnActivateApp(uint32_t connection_key,
// In this case we need to activate application
if (false == permissions.appRevoked && true == permissions.isSDLAllowed) {
SDL_LOG_INFO("Application will be activated");
+ sync_primitives::AutoReadUnlock unlock(policy_manager_lock_);
if (application_manager_.ActivateApplication(app)) {
last_activated_app_id_ = 0;
}
diff --git a/src/components/include/utils/rwlock.h b/src/components/include/utils/rwlock.h
index 5c7735713e..d98a2c7db7 100644
--- a/src/components/include/utils/rwlock.h
+++ b/src/components/include/utils/rwlock.h
@@ -176,6 +176,40 @@ class AutoWriteLock {
DISALLOW_COPY_AND_ASSIGN(AutoWriteLock);
};
+/**
+ * @brief Unlocks read-write lock which locked on read
+ */
+class AutoReadUnlock {
+ public:
+ explicit AutoReadUnlock(RWLock& rwlock) : rwlock_(rwlock) {
+ rwlock_.Release();
+ }
+ ~AutoReadUnlock() {
+ rwlock_.AcquireForReading();
+ }
+
+ private:
+ RWLock& rwlock_;
+ DISALLOW_COPY_AND_ASSIGN(AutoReadUnlock);
+};
+
+/**
+ * @brief Unlocks read-write lock which locked on write
+ */
+class AutoWriteUnlock {
+ public:
+ explicit AutoWriteUnlock(RWLock& rwlock) : rwlock_(rwlock) {
+ rwlock_.Release();
+ }
+ ~AutoWriteUnlock() {
+ rwlock_.AcquireForWriting();
+ }
+
+ private:
+ RWLock& rwlock_;
+ DISALLOW_COPY_AND_ASSIGN(AutoWriteUnlock);
+};
+
} // namespace sync_primitives
#endif // SRC_COMPONENTS_INCLUDE_UTILS_RWLOCK_H_
diff --git a/src/components/protocol_handler/include/protocol_handler/multiframe_builder.h b/src/components/protocol_handler/include/protocol_handler/multiframe_builder.h
index 3da63bd79f..5a63532626 100644
--- a/src/components/protocol_handler/include/protocol_handler/multiframe_builder.h
+++ b/src/components/protocol_handler/include/protocol_handler/multiframe_builder.h
@@ -40,6 +40,7 @@
#include "protocol_handler/protocol_packet.h"
#include "utils/date_time.h"
+#include "utils/lock.h"
/**
*\namespace protocol_handlerHandler
@@ -125,6 +126,7 @@ class MultiFrameBuilder {
// Map of frames with last frame data for messages received in multiple
// frames.
MultiFrameMap multiframes_map_;
+ sync_primitives::Lock multiframes_map_lock_;
int64_t consecutive_frame_wait_msecs_;
};
diff --git a/src/components/protocol_handler/src/multiframe_builder.cc b/src/components/protocol_handler/src/multiframe_builder.cc
index 69e39beaa2..0cffe724c7 100644
--- a/src/components/protocol_handler/src/multiframe_builder.cc
+++ b/src/components/protocol_handler/src/multiframe_builder.cc
@@ -58,6 +58,7 @@ void MultiFrameBuilder::set_waiting_timeout(
bool MultiFrameBuilder::AddConnection(const ConnectionID connection_id) {
SDL_LOG_DEBUG("Adding connection_id: " << connection_id);
+ sync_primitives::AutoLock lock(multiframes_map_lock_);
SDL_LOG_DEBUG("Current state is: " << multiframes_map_);
const MultiFrameMap::const_iterator it = multiframes_map_.find(connection_id);
if (it != multiframes_map_.end()) {
@@ -70,6 +71,7 @@ bool MultiFrameBuilder::AddConnection(const ConnectionID connection_id) {
bool MultiFrameBuilder::RemoveConnection(const ConnectionID connection_id) {
SDL_LOG_DEBUG("Removing connection_id: " << connection_id);
+ sync_primitives::AutoLock lock(multiframes_map_lock_);
SDL_LOG_DEBUG("Current state is: " << multiframes_map_);
const MultiFrameMap::iterator it = multiframes_map_.find(connection_id);
if (it == multiframes_map_.end()) {
@@ -88,6 +90,7 @@ bool MultiFrameBuilder::RemoveConnection(const ConnectionID connection_id) {
ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() {
SDL_LOG_AUTO_TRACE();
+ sync_primitives::AutoLock lock(multiframes_map_lock_);
SDL_LOG_DEBUG("Current state is: " << multiframes_map_);
SDL_LOG_DEBUG("Current multiframe map size is: " << multiframes_map_.size());
ProtocolFramePtrList outpute_frame_list;
@@ -140,7 +143,6 @@ ProtocolFramePtrList MultiFrameBuilder::PopMultiframes() {
RESULT_CODE MultiFrameBuilder::AddFrame(const ProtocolFramePtr packet) {
SDL_LOG_AUTO_TRACE();
SDL_LOG_DEBUG("Handling frame: " << packet);
- SDL_LOG_DEBUG("Current state is: " << multiframes_map_);
if (!packet) {
SDL_LOG_ERROR("Skip empty frame");
return RESULT_FAIL;
@@ -161,6 +163,7 @@ RESULT_CODE MultiFrameBuilder::AddFrame(const ProtocolFramePtr packet) {
RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) {
DCHECK_OR_RETURN(packet->frame_type() == FRAME_TYPE_FIRST, RESULT_FAIL);
+ sync_primitives::AutoLock lock(multiframes_map_lock_);
SDL_LOG_DEBUG("Waiting : " << multiframes_map_);
SDL_LOG_DEBUG("Handling FIRST frame: " << packet);
if (packet->payload_size() != 0u) {
@@ -201,6 +204,7 @@ RESULT_CODE MultiFrameBuilder::HandleFirstFrame(const ProtocolFramePtr packet) {
RESULT_CODE MultiFrameBuilder::HandleConsecutiveFrame(
const ProtocolFramePtr packet) {
DCHECK_OR_RETURN(packet->frame_type() == FRAME_TYPE_CONSECUTIVE, RESULT_FAIL);
+ sync_primitives::AutoLock lock(multiframes_map_lock_);
SDL_LOG_DEBUG("Handling CONSECUTIVE frame: " << packet);
const ConnectionID connection_id = packet->connection_id();