【Android Audio】TimeCheck机制

TimeCheck机制(Android R/S)

TimeCheck.cpp
TimeCheck.h
frameworks/av/media/utils/TimeCheck.cpp

TimeCheck守护线程的作用:
当audioserver中IAudioFlinger,IAudioPolicyService,IEffect中的每一个binder函数调用时间超过5s (kDefaultTimeOutMs = 5000)就会触发audioserver进程自杀行为。(最新Google trunk修改为2s)

TimeCheck线程属于audioserver进程,在每次Binder通信时创建一个TimeCheck的对象,同时创建守护线程,在每次调用结束之后销毁。
【Android Audio】TimeCheck机制_第1张图片

bool TimeCheck::TimeCheckThread::threadLoop()
{
    status_t status = TIMED_OUT;
    {
...
		// 需要waitTimeNs为需要等待的时间
        const nsecs_t waitTimeNs = endTimeNs - systemTime();
        if (waitTimeNs > 0) {
            status = mCond.waitRelative(mMutex, waitTimeNs);
        }
        // 超时waitTimeNs之后waitRelative返回TIMED_OUT,无超时返回NO_ERROR。
        if (status != NO_ERROR) {
            // Generate audio HAL processes tombstones and allow time to complete
            // before forcing restart
            // audio hal的进程id获取
            std::vector<pid_t> pids = getAudioHalPids();
            if (pids.size() != 0) {
                for (const auto& pid : pids) {
                    ALOGI("requesting tombstone for pid: %d", pid);
                    // 发送DEBUGGER_SIGNAL信号给audio hal的进程,让tombstone进程对audio hal进行debuggerd操作,生成一个/data/tombstones/tombstone_xx文件
                    sigqueue(pid, DEBUGGER_SIGNAL, {.sival_int = 0});
                }
                // 延时一秒
                sleep(1);
            } else {
                ALOGI("No HAL process pid available, skipping tombstones");
            }
            LOG_EVENT_STRING(LOGTAG_AUDIO_BINDER_TIMEOUT, tag);
            // 线程自身发送SIGABRT信号,让audioserver进程自杀,同时tombstone进程也对audioserver进行debuggerd操作,生成一个/data/tombstones/tombstone_xx文件
            LOG_ALWAYS_FATAL("TimeCheck timeout for %s", tag);
        }
    }
    return true;
}

在这里插入图片描述

1. audiohal进程被杀

audioserver的调用超时之后TimeCheck线程先向audio hal的进程发送DEBUGGER_SIGNAL的信号,触发debuggerd_signal_handler信号,fork子进程crash_dump32产生dump信息,同时该信号触发tombstoned进程将相关dump信息写入到/data/tombstones/tombstone_xx文件。(sigqueue)
【Android Audio】TimeCheck机制_第2张图片
08:25:31.244 11489 11568 I AudioFlinger: [createRecord:2049]
08:25:36.250 11489 11522 I TimeCheck: requesting tombstone for pid: 11490
中间5s超时

2. audioserver进程自杀

在给audio hal进程发生DEBUGGER_SIGNAL的信号之后,再等待1s,然后使用LOG_ALWAYS_FATAL断言函数触发系统调用abort(),发送SIGABRT信号,终止程序,触发debuggerd_signal_handler信号,fork子进程crash_dump32产生dump信息,同时该信号触发tombstoned进程将相关dump信息写入到/data/tombstones/tombstone_xx文件。
LOG_ALWAYS_FATAL实现:
【Android Audio】TimeCheck机制_第3张图片
【Android Audio】TimeCheck机制_第4张图片
08:25:36.250 11489 11522 I TimeCheck: requesting tombstone for pid: 11490
08:25:37.250 11489 11522 F TimeCheck: TimeCheck timeout for IAudioFlinger command 2
中间延时1s

你可能感兴趣的:(android,c++)