Camera2: Fix deadlock issues with getInProgressCount. DO NOT MERGE
Bug: 6243944 Change-Id: Icb32e4b8c4a916eb7c97ac18767cadfc5122ec88
This commit is contained in:
@@ -517,7 +517,9 @@ void EmulatedFakeCamera2::signalError() {
|
|||||||
|
|
||||||
EmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent):
|
EmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent):
|
||||||
Thread(false),
|
Thread(false),
|
||||||
mParent(parent) {
|
mParent(parent),
|
||||||
|
mNextBuffers(NULL),
|
||||||
|
mRequestCount(0) {
|
||||||
mRunning = false;
|
mRunning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,8 +569,8 @@ bool EmulatedFakeCamera2::ConfigureThread::isStreamInUse(uint32_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int EmulatedFakeCamera2::ConfigureThread::getInProgressCount() {
|
int EmulatedFakeCamera2::ConfigureThread::getInProgressCount() {
|
||||||
Mutex::Autolock lock(mInternalsMutex);
|
Mutex::Autolock lock(mInputMutex);
|
||||||
return mNextBuffers == NULL ? 0 : 1;
|
return mRequestCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmulatedFakeCamera2::ConfigureThread::threadLoop() {
|
bool EmulatedFakeCamera2::ConfigureThread::threadLoop() {
|
||||||
@@ -610,6 +612,9 @@ bool EmulatedFakeCamera2::ConfigureThread::threadLoop() {
|
|||||||
Mutex::Autolock lock(mInputMutex);
|
Mutex::Autolock lock(mInputMutex);
|
||||||
mActive = false;
|
mActive = false;
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
Mutex::Autolock lock(mInputMutex);
|
||||||
|
mRequestCount++;
|
||||||
}
|
}
|
||||||
// Get necessary parameters for sensor config
|
// Get necessary parameters for sensor config
|
||||||
|
|
||||||
@@ -770,6 +775,10 @@ bool EmulatedFakeCamera2::ConfigureThread::threadLoop() {
|
|||||||
mRequest = NULL;
|
mRequest = NULL;
|
||||||
mNextBuffers = NULL;
|
mNextBuffers = NULL;
|
||||||
|
|
||||||
|
Mutex::Autolock lock(mInputMutex);
|
||||||
|
mRequestCount--;
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,7 +787,9 @@ EmulatedFakeCamera2::ReadoutThread::ReadoutThread(EmulatedFakeCamera2 *parent):
|
|||||||
mParent(parent),
|
mParent(parent),
|
||||||
mRunning(false),
|
mRunning(false),
|
||||||
mActive(false),
|
mActive(false),
|
||||||
mRequest(NULL)
|
mRequest(NULL),
|
||||||
|
mBuffers(NULL),
|
||||||
|
mRequestCount(0)
|
||||||
{
|
{
|
||||||
mInFlightQueue = new InFlightQueue[kInFlightQueueSize];
|
mInFlightQueue = new InFlightQueue[kInFlightQueueSize];
|
||||||
mInFlightHead = 0;
|
mInFlightHead = 0;
|
||||||
@@ -818,6 +829,7 @@ void EmulatedFakeCamera2::ReadoutThread::setNextCapture(
|
|||||||
mInFlightQueue[mInFlightTail].request = request;
|
mInFlightQueue[mInFlightTail].request = request;
|
||||||
mInFlightQueue[mInFlightTail].buffers = buffers;
|
mInFlightQueue[mInFlightTail].buffers = buffers;
|
||||||
mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize;
|
mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize;
|
||||||
|
mRequestCount++;
|
||||||
|
|
||||||
if (!mActive) {
|
if (!mActive) {
|
||||||
mActive = true;
|
mActive = true;
|
||||||
@@ -850,14 +862,8 @@ bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) {
|
|||||||
|
|
||||||
int EmulatedFakeCamera2::ReadoutThread::getInProgressCount() {
|
int EmulatedFakeCamera2::ReadoutThread::getInProgressCount() {
|
||||||
Mutex::Autolock lock(mInputMutex);
|
Mutex::Autolock lock(mInputMutex);
|
||||||
Mutex::Autolock iLock(mInternalsMutex);
|
|
||||||
|
|
||||||
int requestCount =
|
return mRequestCount;
|
||||||
((mInFlightTail + kInFlightQueueSize) - mInFlightHead)
|
|
||||||
% kInFlightQueueSize;
|
|
||||||
requestCount += (mBuffers == NULL) ? 0 : 1;
|
|
||||||
|
|
||||||
return requestCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EmulatedFakeCamera2::ReadoutThread::threadLoop() {
|
bool EmulatedFakeCamera2::ReadoutThread::threadLoop() {
|
||||||
@@ -996,9 +1002,8 @@ bool EmulatedFakeCamera2::ReadoutThread::threadLoop() {
|
|||||||
ALOGV("Sending image buffer %d to output stream %d",
|
ALOGV("Sending image buffer %d to output stream %d",
|
||||||
i, b.streamId);
|
i, b.streamId);
|
||||||
GraphicBufferMapper::get().unlock(*(b.buffer));
|
GraphicBufferMapper::get().unlock(*(b.buffer));
|
||||||
res = mParent->getStreamInfo(b.streamId).ops->enqueue_buffer(
|
const Stream &s = mParent->getStreamInfo(b.streamId);
|
||||||
mParent->getStreamInfo(b.streamId).ops,
|
res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer);
|
||||||
captureTime, b.buffer);
|
|
||||||
if (res != OK) {
|
if (res != OK) {
|
||||||
ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer,
|
ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer,
|
||||||
strerror(-res), res);
|
strerror(-res), res);
|
||||||
@@ -1018,6 +1023,9 @@ bool EmulatedFakeCamera2::ReadoutThread::threadLoop() {
|
|||||||
mBuffers = NULL;
|
mBuffers = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Mutex::Autolock l(mInputMutex);
|
||||||
|
mRequestCount--;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -185,10 +185,11 @@ private:
|
|||||||
bool mRunning;
|
bool mRunning;
|
||||||
bool threadLoop();
|
bool threadLoop();
|
||||||
|
|
||||||
Mutex mInputMutex; // Protects mActive
|
Mutex mInputMutex; // Protects mActive, mRequestCount
|
||||||
Condition mInputSignal;
|
Condition mInputSignal;
|
||||||
bool mActive; // Whether we're waiting for input requests or actively
|
bool mActive; // Whether we're waiting for input requests or actively
|
||||||
// working on them
|
// working on them
|
||||||
|
size_t mRequestCount;
|
||||||
|
|
||||||
camera_metadata_t *mRequest;
|
camera_metadata_t *mRequest;
|
||||||
|
|
||||||
@@ -222,7 +223,7 @@ private:
|
|||||||
bool threadLoop();
|
bool threadLoop();
|
||||||
|
|
||||||
// Inputs
|
// Inputs
|
||||||
Mutex mInputMutex; // Protects mActive, mInFlightQueue
|
Mutex mInputMutex; // Protects mActive, mInFlightQueue, mRequestCount
|
||||||
Condition mInputSignal;
|
Condition mInputSignal;
|
||||||
bool mActive;
|
bool mActive;
|
||||||
|
|
||||||
@@ -235,6 +236,8 @@ private:
|
|||||||
size_t mInFlightHead;
|
size_t mInFlightHead;
|
||||||
size_t mInFlightTail;
|
size_t mInFlightTail;
|
||||||
|
|
||||||
|
size_t mRequestCount;
|
||||||
|
|
||||||
// Internals
|
// Internals
|
||||||
Mutex mInternalsMutex;
|
Mutex mInternalsMutex;
|
||||||
camera_metadata_t *mRequest;
|
camera_metadata_t *mRequest;
|
||||||
|
|||||||
Reference in New Issue
Block a user