From 04ff9ec118817c023df8f551bb24cc8e770eb443 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: DO NOT MERGE Change-Id: I15dcf719aae4ed0dd3a46150ecba54ed6a7f31f5 --- .../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 bc293d77b..426f6731d 100644 --- a/tools/emulator/system/camera/EmulatedFakeCamera2.cpp +++ b/tools/emulator/system/camera/EmulatedFakeCamera2.cpp @@ -166,22 +166,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();