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

Commit ff0935e4 authored by Jayant Chowdhary's avatar Jayant Chowdhary Committed by Automerger Merge Worker
Browse files

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

parents 1f41a565 48162a77
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -41,8 +41,10 @@ bool CameraServiceWatchdog::threadLoop()
            tidToCycleCounterMap[currentThreadId]++;

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

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

        if (cycles != mMaxCycles || cycleLength != mCycleLengthMs) {
            // 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 */
    template<typename T>
    auto watchThread(T func, uint32_t tid) {
        auto res = NULL;

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

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

namespace android {

const static size_t kDisconnectTimeoutMs = 2500;

using namespace camera2;

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

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

    return OK;
}

@@ -238,9 +245,14 @@ status_t Camera2ClientBase<TClientBase>::dumpDevice(

// ICameraClient2BaseUser interface


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

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

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

namespace android {

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

    binder::Status disconnectImpl();

    // Watchdog thread
    sp<CameraServiceWatchdog> mCameraServiceWatchdog;

};

}; // namespace android