国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android BlueDroid分析: OSI中的FixeQueue的實現與使用分析

2019-11-09 18:03:21
字體:
來源:轉載
供稿:網友

說明

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨玉县| 绿春县| 和田市| 图木舒克市| 韶关市| 集安市| 莎车县| 民县| 吴旗县| 尼玛县| 车险| 吴桥县| 遂溪县| 曲靖市| 高陵县| 新津县| 昭苏县| 富顺县| 怀来县| 伽师县| 威海市| 侯马市| 名山县| 汉沽区| 阳东县| 阿克苏市| 华蓥市| 博爱县| 孙吴县| 聊城市| 长治县| 永济市| 五寨县| 宝坻区| 偏关县| 孝感市| 隆回县| 和硕县| 湟源县| 台北市| 常州市|