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

Commit 48162a77 authored by Jayant Chowdhary's avatar Jayant Chowdhary
Browse files

[RESTRICT AUTOMERGE] cameraserver: Add watchdog timer for disconnect.



Bug: 228641945

Test: Add artifical delay of 2 seconds in disconnectImpl, see tombstone

Change-Id: I11254e04d9d883e839dc1a7eee309e249613957e
Signed-off-by: default avatarJayant Chowdhary <jchowdhary@google.com>
parent 05b0583b
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -41,8 +41,10 @@ bool CameraServiceWatchdog::threadLoop()
            tidToCycleCounterMap[currentThreadId]++;
            tidToCycleCounterMap[currentThreadId]++;


            if (tidToCycleCounterMap[currentThreadId] >= mMaxCycles) {
            if (tidToCycleCounterMap[currentThreadId] >= mMaxCycles) {
                ALOGW("CameraServiceWatchdog triggering kill for pid: %d", getpid());
                ALOGW("CameraServiceWatchdog triggering abort for pid: %d", getpid());
                kill(getpid(), SIGKILL);
                // We use abort here so we can get a tombstone for better
                // debugging.
                abort();
            }
            }
        }
        }
    }
    }
+3 −4
Original line number Original line Diff line number Diff line
@@ -26,7 +26,7 @@
 *   and single call monitoring differently. See function documentation for
 *   and single call monitoring differently. See function documentation for
 *   more details.
 *   more details.
 */
 */

#pragma once
#include <chrono>
#include <chrono>
#include <thread>
#include <thread>
#include <time.h>
#include <time.h>
@@ -61,7 +61,7 @@ public:
    /** Used to wrap monitored calls in start and stop functions using custom timer values */
    /** Used to wrap monitored calls in start and stop functions using custom timer values */
    template<typename T>
    template<typename T>
    auto watchThread(T func, uint32_t tid, uint32_t cycles, uint32_t cycleLength) {
    auto watchThread(T func, uint32_t tid, uint32_t cycles, uint32_t cycleLength) {
        auto res = NULL;
        decltype(func()) res;


        if (cycles != mMaxCycles || cycleLength != mCycleLengthMs) {
        if (cycles != mMaxCycles || cycleLength != mCycleLengthMs) {
            // Create another instance of the watchdog to prevent disruption
            // Create another instance of the watchdog to prevent disruption
@@ -84,10 +84,9 @@ public:
    /** Used to wrap monitored calls in start and stop functions using class timer values */
    /** Used to wrap monitored calls in start and stop functions using class timer values */
    template<typename T>
    template<typename T>
    auto watchThread(T func, uint32_t tid) {
    auto watchThread(T func, uint32_t tid) {
        auto res = NULL;


        start(tid);
        start(tid);
        res = func();
        auto res = func();
        stop(tid);
        stop(tid);


        return res;
        return res;
+13 −1
Original line number Original line Diff line number Diff line
@@ -40,6 +40,9 @@
#include "utils/CameraServiceProxyWrapper.h"
#include "utils/CameraServiceProxyWrapper.h"


namespace android {
namespace android {

const static size_t kDisconnectTimeoutMs = 2500;

using namespace camera2;
using namespace camera2;


// Interface used by CameraService
// Interface used by CameraService
@@ -145,6 +148,10 @@ status_t Camera2ClientBase<TClientBase>::initializeImpl(TProviderPtr providerPtr
    wp<NotificationListener> weakThis(this);
    wp<NotificationListener> weakThis(this);
    res = mDevice->setNotifyCallback(weakThis);
    res = mDevice->setNotifyCallback(weakThis);


    /** Start watchdog thread */
    mCameraServiceWatchdog = new CameraServiceWatchdog();
    mCameraServiceWatchdog->run("Camera2ClientBaseWatchdog");

    return OK;
    return OK;
}
}


@@ -239,9 +246,14 @@ status_t Camera2ClientBase<TClientBase>::dumpDevice(


// ICameraClient2BaseUser interface
// ICameraClient2BaseUser interface



template <typename TClientBase>
template <typename TClientBase>
binder::Status Camera2ClientBase<TClientBase>::disconnect() {
binder::Status Camera2ClientBase<TClientBase>::disconnect() {
    return mCameraServiceWatchdog->WATCH_CUSTOM_TIMER(disconnectImpl(),
            kDisconnectTimeoutMs / kCycleLengthMs, kCycleLengthMs);
}

template <typename TClientBase>
binder::Status Camera2ClientBase<TClientBase>::disconnectImpl() {
    ATRACE_CALL();
    ATRACE_CALL();
    ALOGD("Camera %s: start to disconnect", TClientBase::mCameraIdStr.string());
    ALOGD("Camera %s: start to disconnect", TClientBase::mCameraIdStr.string());
    Mutex::Autolock icl(mBinderSerializationLock);
    Mutex::Autolock icl(mBinderSerializationLock);
+7 −0
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@


#include "common/CameraDeviceBase.h"
#include "common/CameraDeviceBase.h"
#include "camera/CaptureResult.h"
#include "camera/CaptureResult.h"
#include "CameraServiceWatchdog.h"


namespace android {
namespace android {


@@ -175,6 +176,12 @@ protected:
private:
private:
    template<typename TProviderPtr>
    template<typename TProviderPtr>
    status_t              initializeImpl(TProviderPtr providerPtr, const String8& monitorTags);
    status_t              initializeImpl(TProviderPtr providerPtr, const String8& monitorTags);

    binder::Status disconnectImpl();

    // Watchdog thread
    sp<CameraServiceWatchdog> mCameraServiceWatchdog;

};
};


}; // namespace android
}; // namespace android