From 0825f8b65bc053eead1ca4aa44dee77b40f90f12 Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Fri, 7 Dec 2012 12:32:00 -0800 Subject: [PATCH] Camera2: Fix a deadlock when closing the camera Change-Id: I8b6be364ca90b0eed62ae03c1548680c0b2f0e64 --- .../system/camera/EmulatedFakeCamera2.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp index 63ae591b7..bcbe2116a 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp @@ -165,22 +165,26 @@ status_t EmulatedFakeCamera2::connectCamera(hw_device_t** device) { } status_t EmulatedFakeCamera2::closeCamera() { - Mutex::Autolock l(mMutex); + { + Mutex::Autolock l(mMutex); - status_t res; - ALOGV("%s", __FUNCTION__); + status_t res; + ALOGV("%s", __FUNCTION__); - res = mSensor->shutDown(); - if (res != NO_ERROR) { - ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res); - return res; + res = mSensor->shutDown(); + if (res != NO_ERROR) { + ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res); + return res; + } + + mConfigureThread->requestExit(); + mReadoutThread->requestExit(); + mControlThread->requestExit(); + mJpegCompressor->cancel(); } - mConfigureThread->requestExit(); - mReadoutThread->requestExit(); - mControlThread->requestExit(); - mJpegCompressor->cancel(); - + // give up the lock since we will now block and the threads + // can call back into this object mConfigureThread->join(); mReadoutThread->join(); mControlThread->join();