Android BlueDroid分析: OSI中的FixeQueue的实现与使用分析

说明

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存入了数据才能去取数据.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值