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的对象,同时创建守护线程,在每次调用结束之后销毁。
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)
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实现:
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