Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 308f5b6e authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera: synchronize access to mMemoryMap

Test: stress test on partner device
Bug: 64831570
Change-Id: Ib9ece2f876ccb309c4f1bb8f90242a3e91081f47
Merged-In: Ib9ece2f876ccb309c4f1bb8f90242a3e91081f47
parent d429b1f9
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -377,10 +377,14 @@ camera_memory_t* CameraDevice::sGetMemory(int fd, size_t buf_size, uint_t num_bu
    hidl_handle hidlHandle = mem->mHidlHandle;
    MemoryId id = object->mDeviceCallback->registerMemory(hidlHandle, buf_size, num_bufs);
    mem->handle.mId = id;

    {
        Mutex::Autolock _l(object->mMemoryMapLock);
        if (object->mMemoryMap.count(id) != 0) {
            ALOGE("%s: duplicate MemoryId %d returned by client!", __FUNCTION__, id);
        }
        object->mMemoryMap[id] = mem;
    }
    mem->handle.mDevice = object;
    return &mem->handle;
}
@@ -398,7 +402,10 @@ void CameraDevice::sPutMemory(camera_memory_t *data) {
        ALOGE("%s: camera HAL return memory while camera is not opened!", __FUNCTION__);
    }
    device->mDeviceCallback->unregisterMemory(mem->handle.mId);
    {
        Mutex::Autolock _l(device->mMemoryMapLock);
        device->mMemoryMap.erase(mem->handle.mId);
    }
    mem->decStrong(mem);
}

@@ -826,7 +833,16 @@ void CameraDevice::releaseRecordingFrameLocked(
        return;
    }
    if (mDevice->ops->release_recording_frame) {
        CameraHeapMemory* camMemory = mMemoryMap.at(memId);
        CameraHeapMemory* camMemory;
        {
            Mutex::Autolock _l(mMemoryMapLock);
            auto it = mMemoryMap.find(memId);
            if (it == mMemoryMap.end() || it->second == nullptr) {
                ALOGE("%s unknown memoryId %d", __FUNCTION__, memId);
                return;
            }
            camMemory = it->second;
        }
        if (bufferIndex >= camMemory->mNumBufs) {
            ALOGE("%s: bufferIndex %d exceeds number of buffers %d",
                    __FUNCTION__, bufferIndex, camMemory->mNumBufs);
+2 −0
Original line number Diff line number Diff line
@@ -165,6 +165,8 @@ private:

    sp<ICameraDeviceCallback> mDeviceCallback = nullptr;

    mutable Mutex mMemoryMapLock; // gating access to mMemoryMap
                                  // must not hold mLock after this lock is acquired
    std::unordered_map<MemoryId, CameraHeapMemory*> mMemoryMap;

    bool mMetadataMode = false;