最大限度缩短唤醒租约获取时间(无超时)
假设您有一个驱动程序 X,它会接收可唤醒系统的中断。然后,驱动程序 X 会对中断进行一些处理,并将事件传递给驱动程序 Y。理想情况下,只有在实际唤醒系统的某个中断到达时,或者在驱动程序 X 观察到系统开始挂起且不知道驱动程序 Y 是否已处理之前的事件时,驱动程序 X 才会获得唤醒租约。
对于下面的两种方法,我们都需要观察系统何时暂停和恢复。如需了解如何观察这些系统转换,请参阅针对暂停或恢复执行操作。
带内租约
我们先假设驱动程序 X 和驱动程序 Y 使用一种协议,其中消息可以包含事件数据、唤醒租约,或事件数据和唤醒租约。在 FIDL 中,我们将其表示为包含唤醒租约和事件数据条目的表格。
当系统处于暂停状态时,如果驱动程序 X 收到中断,则会执行以下操作: * 创建唤醒租约 * 确认中断 * 递增上次收到事件的序列号 * 递增上次创建唤醒租约的事件的序列号 * 向驱动程序 Y 发送事件和唤醒租约
当系统恢复(即未暂停)时,如果驱动程序 X 收到事件,则会执行以下操作: * 确认中断 * 递增上次收到事件的序列号 * 向驱动程序 Y 发送事件
当驱动程序 X 观察到系统开始挂起时: * 将收到的最后一个事件的序列号与上次创建的唤醒租约的序列号进行比较,如果不匹配,则: * 创建唤醒租约 * 向驱动程序 Y 发送唤醒租约
驱动程序 Y 会接收消息,如果消息包含唤醒租约,则会将其保持,直到处理来自驱动程序 X 的最新事件为止。
带外租约
首先假设驱动程序 X 和驱动程序 Y 使用仅用于讨论其域事件的协议,并使用单独的协议(或单个协议的单独方法)来传递唤醒租约。
当系统处于暂停状态时,如果驱动程序 X 收到中断: * 驱动程序 X: * 创建唤醒租约 * 确认中断 * 递增其收到的最后一个事件的序列号 * 递增其创建唤醒租约时的最后一个事件的序列号 * 向驱动程序 Y 发送事件 * 向驱动程序 Y 发送唤醒租约和序列号 * 驱动程序 Y(请注意,它可以按任意顺序接收这两条消息): * 接收事件: * 对其进行处理 * 递增其上次收到的序列号 * 接收唤醒租约和序列号: * 保持唤醒租约,直到其上次看到的序列号与租约的序列号匹配
当系统恢复(即未暂停)时,如果驱动程序 X 收到事件,则: * 驱动程序 X: * 确认中断 * 递增其上次收到事件的序列号 * 向驱动程序 Y 发送事件 * 驱动程序 Y: * 接收事件并进行处理 * 递增其上次收到的序列号
当驱动程序 X 观察到系统开始暂停时: * 驱动程序 X: * 将上次收到的事件的序列号与上次创建的唤醒租约的序列号进行比较,如果不匹配,则: * 创建唤醒租约 * 更新为其创建唤醒租约的上次事件的序列号,使其与上次收到的事件的序列号匹配 * 向驱动程序 Y 发送唤醒租约和序列号 * 驱动程序 Y: * 接收唤醒租约和序列号 * 保持唤醒租约,直到其上次看到的序列号与租约的序列号匹配