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

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

Merge "Fix external camera HAL crashes" into main

parents a08ba883 65382f6a
Loading
Loading
Loading
Loading
+12 −12
Original line number Original line Diff line number Diff line
@@ -224,10 +224,6 @@ void ExternalCameraDeviceSession::initOutputThread() {
}
}


void ExternalCameraDeviceSession::closeOutputThread() {
void ExternalCameraDeviceSession::closeOutputThread() {
    closeOutputThreadImpl();
}

void ExternalCameraDeviceSession::closeOutputThreadImpl() {
    if (mOutputThread != nullptr) {
    if (mOutputThread != nullptr) {
        mOutputThread->flush();
        mOutputThread->flush();
        mOutputThread->requestExitAndWait();
        mOutputThread->requestExitAndWait();
@@ -235,6 +231,13 @@ void ExternalCameraDeviceSession::closeOutputThreadImpl() {
    }
    }
}
}


void ExternalCameraDeviceSession::closeBufferRequestThread() {
    if (mBufferRequestThread != nullptr) {
        mBufferRequestThread->requestExitAndWait();
        mBufferRequestThread.reset();
    }
}

Status ExternalCameraDeviceSession::initStatus() const {
Status ExternalCameraDeviceSession::initStatus() const {
    Mutex::Autolock _l(mLock);
    Mutex::Autolock _l(mLock);
    Status status = Status::OK;
    Status status = Status::OK;
@@ -248,7 +251,7 @@ Status ExternalCameraDeviceSession::initStatus() const {
ExternalCameraDeviceSession::~ExternalCameraDeviceSession() {
ExternalCameraDeviceSession::~ExternalCameraDeviceSession() {
    if (!isClosed()) {
    if (!isClosed()) {
        ALOGE("ExternalCameraDeviceSession deleted before close!");
        ALOGE("ExternalCameraDeviceSession deleted before close!");
        close(/*callerIsDtor*/ true);
        closeImpl();
    }
    }
}
}


@@ -1411,19 +1414,16 @@ Status ExternalCameraDeviceSession::importBufferLocked(int32_t streamId, uint64_
}
}


ScopedAStatus ExternalCameraDeviceSession::close() {
ScopedAStatus ExternalCameraDeviceSession::close() {
    close(false);
    closeImpl();
    return fromStatus(Status::OK);
    return fromStatus(Status::OK);
}
}


void ExternalCameraDeviceSession::close(bool callerIsDtor) {
void ExternalCameraDeviceSession::closeImpl() {
    Mutex::Autolock _il(mInterfaceLock);
    Mutex::Autolock _il(mInterfaceLock);
    bool closed = isClosed();
    bool closed = isClosed();
    if (!closed) {
    if (!closed) {
        if (callerIsDtor) {
            closeOutputThreadImpl();
        } else {
        closeOutputThread();
        closeOutputThread();
        }
        closeBufferRequestThread();


        Mutex::Autolock _l(mLock);
        Mutex::Autolock _l(mLock);
        // free all buffers
        // free all buffers
+2 −2
Original line number Original line Diff line number Diff line
@@ -240,9 +240,9 @@ class ExternalCameraDeviceSession : public BnCameraDeviceSession, public OutputT
    // To init/close different version of output thread
    // To init/close different version of output thread
    void initOutputThread();
    void initOutputThread();
    void closeOutputThread();
    void closeOutputThread();
    void closeOutputThreadImpl();
    void closeBufferRequestThread();


    void close(bool callerIsDtor);
    void closeImpl();
    Status initStatus() const;
    Status initStatus() const;
    status_t initDefaultRequests();
    status_t initDefaultRequests();