[android JB audioflinger] fastmixer-1: StateQueue
来源:互联网 发布:艺术家自杀 知乎 编辑:程序博客网 时间:2024/05/22 12:40
StateQueue :
1. mantain pointers: mMutating,mNext,mExpecting,mAck,mAck;
2. defined: mStates[N=4]; // ring sequence.
StateQueue<T>::begin() {
get mMutating and set status of mMutating = true, which means we're currently in the middle of a mutation
}
对begin()获得的对象进行操作,操作完后调用end();
StateQueue<T>::end(){
set the status of mMutating = false and mark the dirty ,when mMutating=true, stateQueue.push can not be called.
}
理解各变量的用途:
/*
volatile const T* mNext; // written by mutator (push)to advance next, read by observer
volatile const T* mAck; // written by observer (poll) to acknowledge advance of next, read by mutator
// only used by observe
const T* mCurrent; // most recent value returned by poll()
// only used by mutator
T* mMutating; // where updates by mutator are done in place
const T* mExpecting; // what the mutator expects mAck to be set to
bool mInMutation; // whether we're currently in the middle of a mutation
bool mIsDirty; // whether mutating state has been modified since last push
bool mIsInitialized; // whether mutating state has been initialized yet
*/
StateQueue<T>::push()的工作流程:
a. 第一次调用state队列之前,各指针变量状态:mMutating=&mStates[0], mNext=mExpecting=mAck=mAck=NULL
b. 第一次调用:mNext=mExpecting=&mStates[0]; mMutating指向mStates[1], 并赋值mStates[1]=mStates[0], 标识当前mMuatating 所指对象 mIsDirty=false;
如果当前block标识为BLOCK_UNTIL_ACKED,则调用进程进入等待睡眠状态(具体等待时间和平台的时钟中断有关);反之直接返回。
c. 如果另个线程又调用了push.则它将有两种结果:要么直接返回,要么进入睡眠状态。
d. poll 被调用。
StateQueue<T>::poll(){
a. 获得mNext 的值
b. mAck和mCurrent指向mNext
返回mNext 的值.
}
接着前面的push:
e. poll 被调用完,前面调用push 的进程被唤醒,继续执行, 这是 mAck=mNext=mExpecting, mExpecting 被赋值NULL,调用线程返回。
总结: StateQueue 的作用是为线程间提供一个共享循环队列, 一个线程mutator 向队列中写入请求,另一个线程oberser响应写入的请求。当前的请求如果没有被响应,则再次写请求时不能成功。
mixthread is mutator , fast mixer thread is observer
- [android JB audioflinger] fastmixer-1: StateQueue
- [android JB audioflinger] fastmixer 2 --FastMixerState & FastMixerStateQueue
- [android JB audioflinger] SyncEvent
- Android Audio FastMixer 实例
- Android Audioflinger
- Android AudioFlinger
- Android AudioFlinger
- Android AudioFlinger
- android audioflinger
- [Android Audio]AudioFlinger(一)AudioFlinger的启动
- android JB surfaceflinger重点
- Android-Audio-System---AudioFlinger
- Android AudioFlinger(一)
- Android音频系统之AudioFlinger
- Android JB 4.2 中InputManager 启动过程解析 -- 1
- 瞎JB扯淡(1)
- AudioFlinger学习笔记1
- AudioFlinger
- Myeclipse中如何更改jsp默认的打开方式
- 解压rpm包
- SuperMap Deskpro.NET 6R
- extern "C"
- 孙会峰:下一代数据中心演进及云计算应用创新
- [android JB audioflinger] fastmixer-1: StateQueue
- myeclipse如何设置jsp页面的打开方式
- COM 组件设计与应用(八)——实现多接口
- iPad iPhone程序增加和删除启动画面
- 转 html label标签的使用教程
- 9-path工具使用
- SuperMap 应用中心操作(二)——上传和发布插件
- web时代营销战略计划报告
- JS库选择