Android WatchDog

Android WatchDog,第1张

Android WatchDog

一. Native C++ watchdog:

代码

        frameworks/av/media/libwatchdog/include/watchdog/Watchdog.h
        frameworks/av/media/libwatchdog/Watchdog.cpp

 Watchdog.h:


#ifndef ANDROID_WATCHDOG_H
#define ANDROID_WATCHDOG_H

#include 
#include 

namespace android {


class Watchdog final {
public:
    Watchdog(std::chrono::steady_clock::duration timeout);
    ~Watchdog();

private:
    timer_t mTimerId;
};

}  // namespace android

#endif  // ANDROID_WATCHDOG_H

 Watchdog.cpp:


#define LOG_TAG "Watchdog"

#include 

#include 
#include 
#include 
#include 
#include 
#include 

namespace android {

Watchdog::Watchdog(::std::chrono::steady_clock::duration timeout) {
    // Create the timer.
    struct sigevent sev;
    sev.sigev_notify = SIGEV_THREAD_ID;
    sev.sigev_notify_thread_id = base::GetThreadId();
    sev.sigev_signo = SIGABRT;
    sev.sigev_value.sival_ptr = &mTimerId;
    int err = timer_create(CLOCK_MONOTONIC, &sev, &mTimerId);
    if (err != 0) {
        PLOG(FATAL) << "Failed to create timer";
    }

    // Start the timer.
    struct itimerspec spec;
    memset(&spec, 0, sizeof(spec));
    auto ns = std::chrono::duration_cast(timeout);
    LOG_ALWAYS_FATAL_IF(timeout.count() <= 0, "Duration must be positive");
    spec.it_value.tv_sec = ns.count() / 1000000000;
    spec.it_value.tv_nsec = ns.count() % 1000000000;
    err = timer_settime(mTimerId, 0, &spec, nullptr);
    if (err != 0) {
        PLOG(FATAL) << "Failed to start timer";
    }
}

Watchdog::~Watchdog() {
    // Delete the timer.
    int err = timer_delete(mTimerId);
    if (err != 0) {
        PLOG(FATAL) << "Failed to delete timer";
    }
}

}  // namespace android

 使用:发送的signal可以根据自己的需要来修改

#include 
#include "Watchdog.h"


int main(int argc, char** argv)
{
    // Watchdog在下面的代码块有效,
    // 如果在5s内,没有出代码块,就会狗叫,定时器就会给自己发送SIGABRT信号。
    // 如果在5s内出下面的代码块,就会调用Watchdog析构函数,timer_delete删除定时器。
    // 要旨:主要针对代码块,出代码块会析构
    {
        android::Watchdog watchdog(std::chrono::seconds(5));
        // 具体工作XXX
        sleep(6);
    }
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671426.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存