diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp index 25a81ebc28..d24cb814a3 100644 --- a/camera/ndk/impl/ACameraDevice.cpp +++ b/camera/ndk/impl/ACameraDevice.cpp @@ -28,6 +28,10 @@ #include "ACameraCaptureSession.inc" +ACameraDevice::~ACameraDevice() { + mDevice->stopLooper(); +} + namespace android { namespace acam { @@ -116,14 +120,10 @@ CameraDevice::~CameraDevice() { if (!isClosed()) { disconnectLocked(session); } + LOG_ALWAYS_FATAL_IF(mCbLooper != nullptr, + "CameraDevice looper should've been stopped before ~CameraDevice"); mCurrentSession = nullptr; - if (mCbLooper != nullptr) { - mCbLooper->unregisterHandler(mHandler->id()); - mCbLooper->stop(); - } } - mCbLooper.clear(); - mHandler.clear(); } void @@ -892,6 +892,16 @@ CameraDevice::onCaptureErrorLocked( return; } +void CameraDevice::stopLooper() { + Mutex::Autolock _l(mDeviceLock); + if (mCbLooper != nullptr) { + mCbLooper->unregisterHandler(mHandler->id()); + mCbLooper->stop(); + } + mCbLooper.clear(); + mHandler.clear(); +} + CameraDevice::CallbackHandler::CallbackHandler(const char* id) : mId(id) { } diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h index c92a95f822..7a35bf0e81 100644 --- a/camera/ndk/impl/ACameraDevice.h +++ b/camera/ndk/impl/ACameraDevice.h @@ -109,6 +109,9 @@ class CameraDevice final : public RefBase { inline ACameraDevice* getWrapper() const { return mWrapper; }; + // Stop the looper thread and unregister the handler + void stopLooper(); + private: friend ACameraCaptureSession; camera_status_t checkCameraClosedOrErrorLocked() const; @@ -354,7 +357,7 @@ struct ACameraDevice { sp chars) : mDevice(new android::acam::CameraDevice(id, cb, chars, this)) {} - ~ACameraDevice() {}; + ~ACameraDevice(); /******************* * NDK public APIs * diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp index 8a3bb46711..35c83551c2 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.cpp @@ -45,13 +45,7 @@ using namespace android; ACameraDevice::~ACameraDevice() { - Mutex::Autolock _l(mDevice->mDeviceLock); - if (mDevice->mCbLooper != nullptr) { - mDevice->mCbLooper->unregisterHandler(mDevice->mHandler->id()); - mDevice->mCbLooper->stop(); - } - mDevice->mCbLooper.clear(); - mDevice->mHandler.clear(); + mDevice->stopLooper(); } namespace android { @@ -140,13 +134,9 @@ CameraDevice::~CameraDevice() { disconnectLocked(session); } mCurrentSession = nullptr; - if (mCbLooper != nullptr) { - mCbLooper->unregisterHandler(mHandler->id()); - mCbLooper->stop(); - } + LOG_ALWAYS_FATAL_IF(mCbLooper != nullptr, + "CameraDevice looper should've been stopped before ~CameraDevice"); } - mCbLooper.clear(); - mHandler.clear(); } void @@ -1410,6 +1400,16 @@ CameraDevice::checkAndFireSequenceCompleteLocked() { } } +void CameraDevice::stopLooper() { + Mutex::Autolock _l(mDeviceLock); + if (mCbLooper != nullptr) { + mCbLooper->unregisterHandler(mHandler->id()); + mCbLooper->stop(); + } + mCbLooper.clear(); + mHandler.clear(); +} + /** * Camera service callback implementation */ diff --git a/camera/ndk/ndk_vendor/impl/ACameraDevice.h b/camera/ndk/ndk_vendor/impl/ACameraDevice.h index d8df5684a7..9e034c48e1 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraDevice.h +++ b/camera/ndk/ndk_vendor/impl/ACameraDevice.h @@ -133,6 +133,9 @@ class CameraDevice final : public RefBase { bool setDeviceMetadataQueues(); inline ACameraDevice* getWrapper() const { return mWrapper; }; + // Stop the looper thread and unregister the handler + void stopLooper(); + private: friend ACameraCaptureSession; friend ACameraDevice;