防止資料處理管道中的系統暫停
在許多情況下,事件需要多個元件參與處理。假設您是驅動程式庫,收到可能會喚醒系統的事件,或是在系統喚醒時收到事件,應防止系統暫停。中斷處理驅動程式庫可能不知道事件的重要性,並將其傳遞給另一個驅動程式庫或元件,這種情況很常見。
您可以選擇幾種方式來管理這項交接作業。為了方便討論,假設驅動程式 X 收到中斷,並透過 FIDL 訊息將事件交給驅動程式 Y。如果 X 是驅動程式庫,Y 是非驅動程式庫元件,這些選項也同樣適用。
接力
解決這個問題的方法之一,是將接力棒與事件資料一併傳遞。「接力」的概念來自於接力賽,參賽者會將物體從一人傳遞到另一人,以完成任務 (即賽跑)。
我們的接力棒是 LeaseToken,例如 ActivityGovernor.AcquireWakeLease 或 fuchsia.power.broker/Topology.Lease 傳回的接力棒。
X 收到中斷時,會執行以下操作:
- 通話
ActivityGovernor.AcquireWakeLease - 確認中斷
- 對事件執行任何處理,例如轉換為新類型
- 將事件和從
AcquireWakeLease取得的LeaseToken傳遞至 Y
這個方法需要變更 X 和 Y 之間使用的通訊協定。使用下述通訊協定互鎖機制時,不需要這麼做,但有其他缺點。
如果系統的事件發生率很高,呼叫 ActivityGovernor.AcquireWakeLease 的 IPC 負擔可能會過高,無法在「每個」事件中執行。在這種情況下,驅動程式 X 可以複製 LeaseToken (因為這實際上只是 Zircon 事件配對的控制代碼),傳遞副本,並保留原始副本一段逾時時間,而不是直接將 LeaseToken 從 X 移至 Y。如果選擇使用逾時,請謹慎選擇逾時時間,因為系統必須捨棄所有 LeaseToken 的副本,才能暫停作業。強烈建議不要使用長逾時,使用逾時的原因是事件發生率相對較高,這表示您應該可以選擇短逾時。如果您編寫 C++,可以使用 TimeoutWakeLease 類別,根據新事件的到達時間管理租約及延長逾時時間。請呼叫 AcquireWakeLease 來使用輔助程式,不要自行與 ActivityGovernor 能力通訊。
通訊協定互鎖
如果驅動程式 X 和驅動程式 Y 的事件傳遞通訊協定包含確認,或新增了這項確認,則可選擇「通訊協定互鎖」。Y 會先呼叫 ActivityGovernor.AcquireWakeLease,再向 X 確認 Y 已收到事件,藉此實作通訊協定互鎖。
這個方法的步驟如下:
- X 呼叫
ActivityGovernor.AcquireWakeLease - 確認中斷
- X 對事件執行任何必要處理,可能將其轉換為新類型
- 將事件傳遞給 Y
- Y 呼叫
ActivityGovernor.AcquireWakeLease - Y 向 X 確認已收到事件
- X 捨棄
LeaseToken - Y 對事件執行任何處理作業
- Y 捨棄
LeaseToken
如果通訊協定已有確認機制,則通訊協定互鎖不需要變更 X 和 Y 之間使用的通訊協定。這項策略會增加對系統活動管理工具的 IPC 呼叫次數。呼叫次數增加是否有意義,取決於事件頻率,以及 X 和 Y 是否在逾時期間保留 LeaseToken。如果選擇使用逾時,請謹慎選擇逾時時間,因為系統在 LeaseToken 捨棄前無法暫停。強烈建議不要設定過長的逾時時間,因為使用逾時時間的原因是事件發生率相對較高,這表示您應該可以選擇較短的逾時時間。如果您使用 C++ 撰寫程式碼,可以透過 TimeoutWakeLease 類別管理租約,並根據新事件的抵達時間延長逾時時間。呼叫 AcquireWakeLease 即可使用輔助程式,不必自行與 ActivityGovernor 能力互動。
逾時
使用逾時機制確保系統正確性,並非與電源架構整合的首選做法。其他選項僅將逾時做為最佳化。由於難以找到合適的逾時值,逾時可能會導致無法預測的行為。此外,通常必須針對每個用途、產品設定和硬體設定組合調整逾時,因此管理逾時是一項重要工作。逾時本質上具有競爭性,因此對於任何指定的逾時值,它可能會讓您在大多數時間贏得競爭,直到突然不行為止。通常只有在軟體部署至大型測試或使用者群體時,才會發現失敗,並在觀察時造成混淆。
有時逾時是唯一可行的選項。如果設定逾時,驅動程式 X 會呼叫 ActivityGovernor.AcquireWakeLease、確認中斷,然後保留租約,直到逾時為止,驅動程式 Y 則不會看到租約。如果在逾時前收到另一個中斷訊號,驅動程式 X 只要延長逾時時間,不必取得額外租約。如果您使用 C++ 編寫,可以使用輔助類別,根據新中斷的到達時間管理租約和延長逾時。請呼叫 AcquireWakeLease,而不是自行與 ActivityGovernor 能力通訊,即可使用輔助程式。