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