Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ec9acdb authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Camera1: Release mSerializationLock before calling into CameraService" into main

parents ff46bc55 676fca0e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -247,3 +247,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    namespace: "camera_platform"
    name: "api1_release_binderlock_before_cameraservice_disconnect"
    description: "Drop mSerializationLock in Camera1 client when calling into CameraService"
    bug: "351778072"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+14 −2
Original line number Diff line number Diff line
@@ -24,11 +24,12 @@
#include <utils/Log.h>
#include <utils/Trace.h>

#include <android/hardware/camera2/ICameraDeviceCallbacks.h>
#include <camera/CameraUtils.h>
#include <camera/StringUtils.h>
#include <com_android_internal_camera_flags.h>
#include <cutils/properties.h>
#include <gui/Surface.h>
#include <android/hardware/camera2/ICameraDeviceCallbacks.h>

#include "api1/Camera2Client.h"

@@ -50,6 +51,8 @@
namespace android {
using namespace camera2;

namespace flags = com::android::internal::camera::flags;

// Interface used by CameraService

Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
@@ -501,7 +504,16 @@ binder::Status Camera2Client::disconnect() {
    bool hasDeviceError = mDevice->hasDeviceError();
    mDevice->disconnect();

    if (flags::api1_release_binderlock_before_cameraservice_disconnect()) {
        // CameraService::Client::disconnect calls CameraService which attempts to lock
        // CameraService's mServiceLock. This might lead to a deadlock if the cameraservice is
        // currently waiting to lock mSerializationLock on another thread.
        mBinderSerializationLock.unlock();
        CameraService::Client::disconnect();
        mBinderSerializationLock.lock();
    } else {
        CameraService::Client::disconnect();
    }

    int32_t closeLatencyMs = ns2ms(systemTime() - startTime);
    mCameraServiceProxyWrapper->logClose(mCameraIdStr, closeLatencyMs, hasDeviceError);