void SurfaceFlinger::queueTransaction(TransactionState& state) {
Mutex::Autolock _l(mQueueLock);
// If its TransactionQueue already has a pending TransactionState or if it is pending
auto itr = mPendingTransactionQueues.find(state.applyToken);
// if this is an animation frame, wait until prior animation frame has
// been applied by SF
if (state.flags & eAnimation) {
while (itr != mPendingTransactionQueues.end()) {
status_t err = mTransactionQueueCV.waitRelative(mQueueLock, s2ns(5));
if (CC_UNLIKELY(err != NO_ERROR)) {
ALOGW_IF(err == TIMED_OUT,
"setTransactionState timed out "
"waiting for animation frame to apply");
break;
}
itr = mPendingTransactionQueues.find(state.applyToken);
}
}
如果当前是一个动画帧且该进程有未完成的事务,则等待完成,每个事务最多等 5 秒。
void SurfaceFlinger::queueTransaction(TransactionState& state) {
...
// Generate a CountDownLatch pending state if this is a synchronous transaction.
if ((state.flags & eSynchronous) || state.inputWindowCommands.syncInputWindows) {
state.transactionCommittedSignal = std::make_shared<CountDownLatch>(
(state.inputWindowCommands.syncInputWindows
? (CountDownLatch::eSyncInputWindows | CountDownLatch::eSyncTransaction)
: CountDownLatch::eSyncTransaction));
}
mTransactionQueue.emplace(state);
ATRACE_INT("TransactionQueue", mTransactionQueue.size());
const auto schedule = [](uint32_t flags) {
if (flags & eEarlyWakeupEnd) return TransactionSchedule::EarlyEnd;
if (flags & eEarlyWakeupStart) return TransactionSchedule::EarlyStart;
return TransactionSchedule::Late;
}(state.flags);
setTransactionFlags(eTransactionFlushNeeded, schedule, state.applyToken);
}
transactionCommittedSignal
。如果设置了 transactionCommittedSignal
在 SurfaceFlinger::setTransactionState() 中调用 queueTransaction()
并最多等待 5 秒。mTransactionQueue
中。setTransactionFlags()
设置 eTransactionFlushNeeded
。在下一个 VSYNC 到来时,在 SurfaceFlinger::handleMessageTransaction() 中调用 SurfaceFlinger::flushTransactionQueues()。