From cf6e6e2e60972a0d344813d304092f2b5db7ab3f Mon Sep 17 00:00:00 2001 From: Shukla Mradul Date: Fri, 5 May 2017 12:09:11 +0530 Subject: msm8996-common: camera: HAL3: Error occurs while unmapping buffer Issue: STL operation such as erase ,push_back needs to be atomic. List to keep reprocessed meta and buffer is prone to simultaneous access from other part of codes causing STL operations to fail. Fix: Keeping STL operation of list for buffer and meta both in mutex. Change-Id: I8b966ee993a981ae64099093ff131d305f0cca94 --- camera/QCamera2/HAL3/QCamera3Channel.cpp | 48 ++++++++++++++++++-------------- camera/QCamera2/HAL3/QCamera3Channel.h | 2 ++ 2 files changed, 29 insertions(+), 21 deletions(-) (limited to 'camera') diff --git a/camera/QCamera2/HAL3/QCamera3Channel.cpp b/camera/QCamera2/HAL3/QCamera3Channel.cpp index e1f6b63..c13cade 100644 --- a/camera/QCamera2/HAL3/QCamera3Channel.cpp +++ b/camera/QCamera2/HAL3/QCamera3Channel.cpp @@ -4036,31 +4036,35 @@ QCamera3Stream * QCamera3ReprocessChannel::getSrcStreamBySrcHandle(uint32_t srcH int32_t QCamera3ReprocessChannel::unmapOfflineBuffers(bool all) { int rc = NO_ERROR; - if (!mOfflineBuffers.empty()) { - QCamera3Stream *stream = NULL; - List::iterator it = mOfflineBuffers.begin(); - for (; it != mOfflineBuffers.end(); it++) { - stream = (*it).stream; - if (NULL != stream) { - rc = stream->unmapBuf((*it).type, - (*it).index, - -1); - if (NO_ERROR != rc) { - LOGE("Error during offline buffer unmap %d", - rc); + { + Mutex::Autolock lock(mOfflineBuffersLock); + if (!mOfflineBuffers.empty()) { + QCamera3Stream *stream = NULL; + List::iterator it = mOfflineBuffers.begin(); + for (; it != mOfflineBuffers.end(); it++) { + stream = (*it).stream; + if (NULL != stream) { + rc = stream->unmapBuf((*it).type, + (*it).index, + -1); + if (NO_ERROR != rc) { + LOGE("Error during offline buffer unmap %d", + rc); + } + LOGD("Unmapped buffer with index %d", (*it).index); } - LOGD("Unmapped buffer with index %d", (*it).index); - } - if (!all) { - mOfflineBuffers.erase(it); - break; - } - } - if (all) { - mOfflineBuffers.clear(); + if (!all) { + mOfflineBuffers.erase(it); + break; + } + } + if (all) { + mOfflineBuffers.clear(); + } } } + Mutex::Autolock lock(mOfflineMetaBuffersLock); if (!mOfflineMetaBuffers.empty()) { QCamera3Stream *stream = NULL; List::iterator it = mOfflineMetaBuffers.begin(); @@ -4450,6 +4454,7 @@ int32_t QCamera3ReprocessChannel::overrideFwkMetadata( mappedBuffer.index = buf_idx; mappedBuffer.stream = pStream; mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF; + Mutex::Autolock lock(mOfflineBuffersLock); mOfflineBuffers.push_back(mappedBuffer); mOfflineBuffersIndex = (int32_t)buf_idx; LOGD("Mapped buffer with index %d", mOfflineBuffersIndex); @@ -4469,6 +4474,7 @@ int32_t QCamera3ReprocessChannel::overrideFwkMetadata( mappedBuffer.index = meta_buf_idx; mappedBuffer.stream = pStream; mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF; + Mutex::Autolock lock(mOfflineMetaBuffersLock); mOfflineMetaBuffers.push_back(mappedBuffer); mOfflineMetaIndex = (int32_t)meta_buf_idx; LOGD("Mapped meta buffer with index %d", mOfflineMetaIndex); diff --git a/camera/QCamera2/HAL3/QCamera3Channel.h b/camera/QCamera2/HAL3/QCamera3Channel.h index 38b6c81..4495072 100644 --- a/camera/QCamera2/HAL3/QCamera3Channel.h +++ b/camera/QCamera2/HAL3/QCamera3Channel.h @@ -568,6 +568,8 @@ private: int32_t resetToCamPerfNormal(uint32_t frameNumber); android::List mOfflineBuffers; android::List mOfflineMetaBuffers; + Mutex mOfflineBuffersLock; + Mutex mOfflineMetaBuffersLock; int32_t mOfflineBuffersIndex; int32_t mOfflineMetaIndex; uint32_t mFrameLen; -- cgit v1.2.3