android fence sync是android中引入的一个同步的机制,主要用在display的graphic buffer的同步管理上,可以让对buffer的操作可以并行执行以减少时间。
在BufferQueue中每个buffer都有一个对应的fence fd,他对应了一个fence object,它表明有角色在操作这块buffer,当fence object变为siganled状态的时候,表明这块buffer已经没有再被操作了。
可以简单的把fence理解为一把锁,当它active的时候表明了对buffer的控制,当它为signaled状态时候,表明不再控制buffer,每个需要使用buffer的角色,在使用前都要检查这把锁是否signaled了才能进行安全的操作,否则就要等待。

sync framework的3个重要元素
sync_timeline:
sync的timeline,timeline最终具体的hardware去支持,简单来说可以把timeline看做是一个counter。
sync_pt:sync point,它是sync timeline上的某个点(可以看做是counter的某个值),每个sync point都属于某一个sync timeline。sync point有active,signaled,error3个状态,初始是active状态,之后会变为signaled或者error状态。
sync_fence:sync fence是由一组sync point构成的,这些sync point可以属于不同的sync timeline。(由一组point形成的栏,还是很形象的)

kernel对于sync支持
/dev/sync

sync机制是由/dev/sync来提供支持的。sync device除了提供fence的ioctl接口之外,还提供给了下面3个接口:
sync_timline_create(struct sync_timeline_ops*op,int size,char*name)
sync_pt_create(sync_timeline*parent,int size)
sync_fence_create(char*name,sync_pt*pt)
从这3个api里面可以看出来,sync是不能直接使用,就是前面所说的需要使用sync机制的hardware去提供支持:
具体的hardware需要提供一组sync_timeline_ops去创建sync_timeline
sync_pt的创建,由具体的hardware去设定size来申请内存,用以保存扩展的信息。

/dev/sw_sync
android提供了一个software sync device来提供具体的sync支持:
sw_sync_timeline_create(),使用sync_timeline_create()来创建一个sw_sync_timeline。
sw_sync_pt_creat(),调用sync_pt_create()创建出一个sync_pt。
sw_sync_timeline_inc(),让timeline increate,这样会signal掉timline上point(value)。
这些接口可以在kernel中直接使用,user层也可以通过操作/dev/sw_sync来建立software sync object。


sync_fence的创建和使用
Kernel层面创建的fence

//初始化int val = 0; //sync pt的值。struct    sync_timeline* timeline = sw_sync_timeline_create("test-timeline");............//创建pt和fencestruct sync_pt * pt = sw_sync_pt_create(timeline,*val);val++;//改变sync pt的值,这样创建出来的sync_pt就会不一样。struct sync_fence* fence = sync_fence_create("test-fence", pt);//绑定fd。这个fd可以返回给user层操作。int fencefd = get_unused_fd();sync_fence_install(fence,fencefd);............//inc timeline,会让对应的sync pt释放,也就是对应的fence释放掉。sw_sync_timeline_inc(timeline, 1);
fence对应的fd在传递到user层之后,我们可以通过操作fd来操作fence了。

user层面使用fence
android层面提供了一组sync的接口来使用fence做同步,在/system/core/libsync下。

//初始化int val = 0;int timeline_fd =  sw_sync_timeline_create();............//创建同步的fence,包含了创建sync pt。int fencefd = sw_sync_fence_create(timeline_fd, "test-fence", val);val++;............//fence fd 可以进行merge,wait等操作............//释放fence。sw_sync_timeline_inc(timeline_fd,1);

fence主要有2个操作:
merge操作,将多个fence merge到一个fd中去,这样fence就变为对应多个sync_pt。
wait操作,在user层调用函数sync_wait(),这个函数是等待fence对应的所有的sync_pt从active变为siganled的状态。
注意fence在操作完毕后,要把对应的fd close掉才行。

android中提供了class Fence,该类使用fence的fd来构造,封装了merge和wait的函数,并且会在析构的时候关闭fd,尽量使用这个类来操作fence。


-------------------------------------------

by sky

更多相关文章

  1. Android开发艺术探索知识回顾——第2章 IPC机制:1、IPC 的基础知
  2. Android(安卓)使用Parcelable序列化对象
  3. Android(安卓)使用Matrix进行图像变换
  4. android常用类库简介
  5. android定位功能(二)
  6. Android(安卓)高手进阶教程(十三)之----Android(安卓)数据库SQLi
  7. 第五章 以数据为中心—数据存取(3)
  8. android studio查看genymotion模拟器上文件目录
  9. Android:国家气象局天气预报接口JSON完全解析

随机推荐

  1. 整理的收集的Android的学习资料(大佬们的
  2. Android(安卓)Studio中的keystore
  3. Android(安卓)重学系列 有趣的工具--智能
  4. Android(安卓)Parcel机制
  5. Android之服务Service和它的CP们(Broadca
  6. 【Android开发】基本组件-列表选择框
  7. Kotlin Android(安卓)UI利器之Anko Layou
  8. 一步一步学习Android(安卓)TV/盒子开发(一
  9. 如何将 Android(安卓)仿真器的速度提升 4
  10. android things 树莓派B3 GPIO口测试及问