Android BlueDroid分析: OSI中的FixeQueue的实现与使用分析
来源:互联网 发布:神魔诛天坐骑进阶数据 编辑:程序博客网 时间:2024/06/06 09:48
说明
fixed_queue使用List来存储数据, 同时使用semophore来控制enqueue与dequeue. 在HCI等地方都有用到.
结构体的组成
typedef struct fixed_queue_t { list_t *list; //用List来保存数据,相当于"queue" semaphore_t *enqueue_sem; // enqueue的信号量,用来通知和监控 semaphore_t *dequeue_sem; //dequeue的信号量,作为reactor(即epoll_wait)中的监听fd pthread_mutex_t lock; // List中锁,因为List在enqueue与dequeue都用到,防止静态 size_t capacity; // List中保存了多少个元素,即queue的size reactor_object_t *dequeue_object; //reactor对象,用于对semophore fd的监控 fixed_queue_cb dequeue_ready; // 用于reactor的poll_wait从Event回来后执行对应的callback函数 void *dequeue_context;} fixed_queue_t;
函数
fixed_queue_register_dequeue
完成在dequeue取出数据后, 对数据进行处理.
重点在于:
queue->dequeue_object = reactor_register( reactor, fixed_queue_get_dequeue_fd(queue),//监听dequeue信号量,enqueue中进行控制,见下面的A2注释 queue, internal_dequeue_ready, NULL );
enqueue与dequeue
在enqueue后,会发送信号, 这样dequeue等待的epoll_wait, 即reactor中的run_reactor就会返回, 然后执行对应的read_ready callback, 这个是整个fixed_queue的重点.
void fixed_queue_enqueue(fixed_queue_t *queue, void *data) { assert(queue != NULL); assert(data != NULL); semaphore_wait(queue->enqueue_sem); //A1:等待dequeue取出数据,取出后才能填充数据,所以等待 pthread_mutex_lock(&queue->lock); // List在enqueue与dequeue都用到,所以加锁 list_append(queue->list, data); //将数据存放到List尾部,完成数据的enqueue pthread_mutex_unlock(&queue->lock); semaphore_post(queue->dequeue_sem); //A2: 发送信号,让epoll_wait从Event返回,执行dequeue注册时候的callback函数,让其取出数据}dequeue
dequeue取出数据,然后通知enqueue可以再次填充数据了.
void *fixed_queue_dequeue(fixed_queue_t *queue) { assert(queue != NULL); semaphore_wait(queue->dequeue_sem); // B1:等待enqueue填充有数据 pthread_mutex_lock(&queue->lock); void *ret = list_front(queue->list); list_remove(queue->list, ret); // 取出数据 pthread_mutex_unlock(&queue->lock); semaphore_post(queue->enqueue_sem); // B2: 通知enqueue可以存放数据了 return ret;}
dequeue与enqueue里面的:
A1 A2, B1,B2,为相互控制, enqueue等dequeue完成才能存放, dequeue需要enqueue存入了数据才能去取数据.
0 0
- Android BlueDroid分析: OSI中的FixeQueue的实现与使用分析
- Android BlueDroid分析: OSI中的reactor的实现与使用分析
- Android BlueDroid分析: OSI中的Thread的实现与使用分析
- Android BlueDroid分析: OSI中的HashMap的实现
- Android BlueDroid分析: OSI中的List与alloctor的实现分析
- Andorid BlueDroid分析: Semophore的实现分析
- Android BlueDroid分析: Linux中的Eventfd
- Android BlueDroid分析: 配置文件(bt_stack.conf bt_vendor.conf )的加载与分析
- Android BlueDroid 分析之扫描
- BlueDroid代码分析
- BlueDroid代码分析
- Bluedroid GKI源码分析
- BlueDroid代码分析之BlueDroid简介
- BlueDroid代码分析之回调函数的注册与调用
- BlueDroid代码分析之GKI
- bluedroid底层分析之GKI
- BlueDroid代码分析之初始化
- BlueDroid代码分析之L2CAP
- 数字金字塔
- qtmain.lib 分析
- jxl解析excel表格代码
- Jquery实现最简单易用的分秒倒计时
- 网络编程--基础篇
- Android BlueDroid分析: OSI中的FixeQueue的实现与使用分析
- Java并发编程的艺术(四)——线程的状态
- Apache中的poi包中的XSSFWorkbook与HSSFWorkbook的区别
- 分布式事务之说说TCC事务
- 分布式事务之说说TCC事务
- [USACO1.5]数字金字塔 Number Triangles
- caffe在ubuntu16.04配置流程
- 隐藏标题栏和底部操作栏,可上下滑动显示
- String StringBuffer StringBuilder 区别整理