From 1e903b0745bfee821297dc837500e1c8a93bbe33 Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Wed, 25 Jul 2012 13:07:30 -0700 Subject: [PATCH] Camera2: Fix deadlock issues with getInProgressCount. DO NOT MERGE Bug: 6243944 Change-Id: Icb32e4b8c4a916eb7c97ac18767cadfc5122ec88 --- .../system/camera/EmulatedFakeCamera2.cpp | 36 +++++++++++-------- .../system/camera/EmulatedFakeCamera2.h | 7 ++-- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp index 711c2d2b6..9fcab91ba 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp @@ -517,7 +517,9 @@ void EmulatedFakeCamera2::signalError() { EmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent): Thread(false), - mParent(parent) { + mParent(parent), + mNextBuffers(NULL), + mRequestCount(0) { mRunning = false; } @@ -567,8 +569,8 @@ bool EmulatedFakeCamera2::ConfigureThread::isStreamInUse(uint32_t id) { } int EmulatedFakeCamera2::ConfigureThread::getInProgressCount() { - Mutex::Autolock lock(mInternalsMutex); - return mNextBuffers == NULL ? 0 : 1; + Mutex::Autolock lock(mInputMutex); + return mRequestCount; } bool EmulatedFakeCamera2::ConfigureThread::threadLoop() { @@ -610,6 +612,9 @@ bool EmulatedFakeCamera2::ConfigureThread::threadLoop() { Mutex::Autolock lock(mInputMutex); mActive = false; return true; + } else { + Mutex::Autolock lock(mInputMutex); + mRequestCount++; } // Get necessary parameters for sensor config @@ -770,6 +775,10 @@ bool EmulatedFakeCamera2::ConfigureThread::threadLoop() { mRequest = NULL; mNextBuffers = NULL; + Mutex::Autolock lock(mInputMutex); + mRequestCount--; + + return true; } @@ -778,7 +787,9 @@ EmulatedFakeCamera2::ReadoutThread::ReadoutThread(EmulatedFakeCamera2 *parent): mParent(parent), mRunning(false), mActive(false), - mRequest(NULL) + mRequest(NULL), + mBuffers(NULL), + mRequestCount(0) { mInFlightQueue = new InFlightQueue[kInFlightQueueSize]; mInFlightHead = 0; @@ -818,6 +829,7 @@ void EmulatedFakeCamera2::ReadoutThread::setNextCapture( mInFlightQueue[mInFlightTail].request = request; mInFlightQueue[mInFlightTail].buffers = buffers; mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize; + mRequestCount++; if (!mActive) { mActive = true; @@ -850,14 +862,8 @@ bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) { int EmulatedFakeCamera2::ReadoutThread::getInProgressCount() { Mutex::Autolock lock(mInputMutex); - Mutex::Autolock iLock(mInternalsMutex); - int requestCount = - ((mInFlightTail + kInFlightQueueSize) - mInFlightHead) - % kInFlightQueueSize; - requestCount += (mBuffers == NULL) ? 0 : 1; - - return requestCount; + return mRequestCount; } bool EmulatedFakeCamera2::ReadoutThread::threadLoop() { @@ -996,9 +1002,8 @@ bool EmulatedFakeCamera2::ReadoutThread::threadLoop() { ALOGV("Sending image buffer %d to output stream %d", i, b.streamId); GraphicBufferMapper::get().unlock(*(b.buffer)); - res = mParent->getStreamInfo(b.streamId).ops->enqueue_buffer( - mParent->getStreamInfo(b.streamId).ops, - captureTime, b.buffer); + const Stream &s = mParent->getStreamInfo(b.streamId); + res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer); if (res != OK) { ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer, strerror(-res), res); @@ -1018,6 +1023,9 @@ bool EmulatedFakeCamera2::ReadoutThread::threadLoop() { mBuffers = NULL; } + Mutex::Autolock l(mInputMutex); + mRequestCount--; + return true; } diff --git a/tools/emulator/system/camera/EmulatedFakeCamera2.h b/tools/emulator/system/camera/EmulatedFakeCamera2.h index 9a0b67623..8af700b70 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.h +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.h @@ -185,10 +185,11 @@ private: bool mRunning; bool threadLoop(); - Mutex mInputMutex; // Protects mActive + Mutex mInputMutex; // Protects mActive, mRequestCount Condition mInputSignal; bool mActive; // Whether we're waiting for input requests or actively // working on them + size_t mRequestCount; camera_metadata_t *mRequest; @@ -222,7 +223,7 @@ private: bool threadLoop(); // Inputs - Mutex mInputMutex; // Protects mActive, mInFlightQueue + Mutex mInputMutex; // Protects mActive, mInFlightQueue, mRequestCount Condition mInputSignal; bool mActive; @@ -235,6 +236,8 @@ private: size_t mInFlightHead; size_t mInFlightTail; + size_t mRequestCount; + // Internals Mutex mInternalsMutex; camera_metadata_t *mRequest;