|
|
|
@ -364,12 +364,12 @@ status_t Camera3Device::disconnect() {
|
|
|
|
|
|
|
|
|
|
status_t Camera3Device::disconnectImpl() {
|
|
|
|
|
ATRACE_CALL();
|
|
|
|
|
Mutex::Autolock il(mInterfaceLock);
|
|
|
|
|
|
|
|
|
|
ALOGI("%s: E", __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
status_t res = OK;
|
|
|
|
|
std::vector<wp<Camera3StreamInterface>> streams;
|
|
|
|
|
{
|
|
|
|
|
Mutex::Autolock il(mInterfaceLock);
|
|
|
|
|
nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
|
|
|
|
|
{
|
|
|
|
|
Mutex::Autolock l(mLock);
|
|
|
|
@ -411,16 +411,19 @@ status_t Camera3Device::disconnectImpl() {
|
|
|
|
|
streams.push_back(mInputStream);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Joining done without holding mLock, otherwise deadlocks may ensue
|
|
|
|
|
// as the threads try to access parent state
|
|
|
|
|
}
|
|
|
|
|
// Joining done without holding mLock and mInterfaceLock, otherwise deadlocks may ensue
|
|
|
|
|
// as the threads try to access parent state (b/143513518)
|
|
|
|
|
if (mRequestThread != NULL && mStatus != STATUS_ERROR) {
|
|
|
|
|
// HAL may be in a bad state, so waiting for request thread
|
|
|
|
|
// (which may be stuck in the HAL processCaptureRequest call)
|
|
|
|
|
// could be dangerous.
|
|
|
|
|
// give up mInterfaceLock here and then lock it again. Could this lead
|
|
|
|
|
// to other deadlocks
|
|
|
|
|
mRequestThread->join();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
Mutex::Autolock il(mInterfaceLock);
|
|
|
|
|
if (mStatusTracker != NULL) {
|
|
|
|
|
mStatusTracker->join();
|
|
|
|
|
}
|
|
|
|
@ -457,7 +460,7 @@ status_t Camera3Device::disconnectImpl() {
|
|
|
|
|
__FUNCTION__, stream->getId(), stream->getStrongCount() - 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
ALOGI("%s: X", __FUNCTION__);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
@ -1768,9 +1771,7 @@ void Camera3Device::internalUpdateStatusLocked(Status status) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3Device::pauseStateNotify(bool enable) {
|
|
|
|
|
// We must not hold mInterfaceLock here since this function is called from
|
|
|
|
|
// RequestThread::threadLoop and holding mInterfaceLock could lead to
|
|
|
|
|
// deadlocks (http://b/143513518)
|
|
|
|
|
Mutex::Autolock il(mInterfaceLock);
|
|
|
|
|
Mutex::Autolock l(mLock);
|
|
|
|
|
|
|
|
|
|
mPauseStateNotify = enable;
|
|
|
|
@ -2340,9 +2341,7 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
|
|
|
|
|
ATRACE_CALL();
|
|
|
|
|
bool ret = false;
|
|
|
|
|
|
|
|
|
|
// We must not hold mInterfaceLock here since this function is called from
|
|
|
|
|
// RequestThread::threadLoop and holding mInterfaceLock could lead to
|
|
|
|
|
// deadlocks (http://b/143513518)
|
|
|
|
|
Mutex::Autolock il(mInterfaceLock);
|
|
|
|
|
nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
|
|
|
|
|
|
|
|
|
|
Mutex::Autolock l(mLock);
|
|
|
|
|