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