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; | 
