定义
“Synchronization between consumers and producers who are from different hardware components to use a buffer atomically”
应用背景
在复杂的DMA管线如图形管线(多媒体,摄像头,GPU以及显示设备),一个buffer的消费者需要知道生产者什么时候完成生产(即创建一个Buffer,并往里面放置消费者所需要的数据)。同样地,生产者也需要知道消费者什么时候使用它创建的Buffer,以便它可以重新使用这个Buffer。而且,一个Buffer可能被多个不同的消费者使用不同的时间。另外,一个消费者可能需要互斥地消费多个Buffer,等等,有一个问题应运而生,就是如何保证多个消费者之间同步使用Buffer,以及生产者与消费者协调使用Buffer。因为Buffer是一个共享资源,且任何消费者或生产者对Buffer的使用都是排他性的(因为它们属于不同的硬件单元或模块),大体看来,需要解决如下两个问题:
1. 消费者与生产者之间对Buffer的同步访问。
2. 消费者之间对Buffer的同步访问。
方案提出
在Android中,引入了Sync框架,它添加了一组API,可以允许生产者和消费者之间以一种通用的方式解决上面提到的同步访问问题,平台需要实现这些Driver定义的同步原语以支持这个Sync框架。
Android Sync框架的目标是:
1. 提供一个通用的API用于表达同步依赖关系。
2. 允许驱动在不同的硬件模块中实现同步。
3. 提供了一套用户空间的API,使得Compositor(等硬件模块)可以管理这些依赖。
4. 提供丰富的测量数据,可以调试图形管线变慢和停止的问题。
驱动代码位于drivers/staging/android/sync.c,主要定义了如下三个数据类型:
• sync_timeline
sync_timeline是一种抽象的单调递增的计数器。通常情况下,每个驱动或硬件模块上下文只有一个sync_timeline。一般需要提供硬件模块特有的Sync驱动或使用通用的sw_sync实现,它是基于CPU的一种实现方式。实现上,是通过这些底层的驱动来创建sync_timeline的。一个硬件模块如果要提供