diff options
author | Shukla Mradul <mradul_shukla@codeaurora.org> | 2017-05-05 12:09:11 +0530 |
---|---|---|
committer | Cosme Domínguez Díaz <cosme.ddiaz@gmail.com> | 2018-03-20 20:34:43 +0100 |
commit | cf6e6e2e60972a0d344813d304092f2b5db7ab3f (patch) | |
tree | 6128832ffd6baaea699949ef42f494e634360e1f | |
parent | 450eb6a2ff2ac2ab776adf53e1975981f5e9b26c (diff) |
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
-rw-r--r-- | camera/QCamera2/HAL3/QCamera3Channel.cpp | 48 | ||||
-rw-r--r-- | camera/QCamera2/HAL3/QCamera3Channel.h | 2 |
2 files changed, 29 insertions, 21 deletions
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<OfflineBuffer>::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<OfflineBuffer>::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<OfflineBuffer>::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<OfflineBuffer> mOfflineBuffers; android::List<OfflineBuffer> mOfflineMetaBuffers; + Mutex mOfflineBuffersLock; + Mutex mOfflineMetaBuffersLock; int32_t mOfflineBuffersIndex; int32_t mOfflineMetaIndex; uint32_t mFrameLen; |