精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙輕內核M核源碼分析系列一 數據結構-雙向循環鏈表

開發
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[397095]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

在學習OpenHarmony鴻蒙輕內核源代碼的時候,常常會遇到一些數據結構的使用。如果沒有掌握它們的用法,會導致閱讀源代碼時很費解、很吃力。本文會給讀者介紹源碼中重要的數據結構,雙向循環鏈表Doubly Linked List。在講解時,會結合數據結構相關繪圖,培養讀者們的數據結構的平面想象能力,幫助更好的學習和理解這些數據結構的用法。

1 雙向循環鏈表

雙向鏈表LOS_DL_LIST的源代碼在utils\los_list.h雙向鏈表頭文件中,包含LOS_DL_LIST結構體定義、inline內聯函數LOS_ListXXX,還有相關的函數宏定義LOS_DL_LIST_XXXX。雙向鏈表頭文件可以網頁訪問utils/los_list.h,也可以檢出到本地閱讀。

1.1 雙向鏈表結構體

雙向鏈表節點結構體LOS_DL_LIST定義如下。其結構非常簡單、通用、抽象,只包含前驅、后繼兩個節點,負責承上啟下的雙向鏈表作用。雙向鏈表不包含任何業務數據信息,一般不會單獨使用。通常,雙向鏈表節點和業務數據信息作為結構體成員,一起組成業務結構體來使用,使用示例稍后會有講述。

  1. typedef struct LOS_DL_LIST { 
  2.     struct LOS_DL_LIST *pstPrev; /** 指向當前鏈表節點的前驅節點的指針 */ 
  3.     struct LOS_DL_LIST *pstNext; /** 指向當前鏈表節點的后繼節點的指針 */ 
  4. } LOS_DL_LIST; 

 從雙向鏈表中的任意一個節點開始,都可以很方便地訪問它的前驅節點和后繼節點,這種環狀數據結構形式使得雙向鏈表在查找、插入、刪除等操作上非常方便。業務場景使用雙向鏈表時,可以定義一個LOS_DL_LIST類型的全局變量作為雙向循環鏈表Head頭結點,業務結構體的鏈表成員節點依次掛載在頭結點上。還有些業務結構體的雙向鏈表節點作為Head頭節點,依次掛載其他業務結構體的鏈表成員節點。從Head節點可以依次遍歷下一個節點,Head節點的前驅節點就是Tail尾節點。

下面通過鴻蒙輕內核代碼中互斥鎖結構體LosMuxCB定義,來了解如何使用雙向鏈表結構體:

  1. typedef struct { 
  2.     UINT8 muxStat;       /**< 互斥鎖狀態  */ 
  3.     UINT16 muxCount;     /**< 互斥鎖當前被持有的次數 */ 
  4.     UINT32 muxID;        /**< 互斥鎖編號ID */ 
  5.     LOS_DL_LIST muxList; /**< 互斥鎖的雙向鏈表 */ 
  6.     LosTaskCB *owner;    /**< 當前持有鎖的任務TCB */ 
  7.     UINT16 priority;     /**< 持有互斥鎖的任務優先級 */ 
  8. } LosMuxCB; 

 互斥鎖結構體中包括雙向鏈表LOS_DL_LIST muxList成員變量和其他包含互斥鎖業務信息的成員變量,這里通過雙向鏈表把各個互斥鎖鏈接起來,掛載在頭結點LOS_DL_LIST g_unusedMuxList;通過其他業務成員變量承載業務數據,鏈表和其他業務成員關系如下圖所示:

2 初始化雙向鏈表

2.1 LOS_ListInit(LOS_DL_LIST *list)

LOS_DL_LIST的兩個成員pstPrev和pstNext, 是LOS_DL_LIST結構體類型的指針。需要為雙向鏈表節點申請長度為sizeof(LOS_DL_LIST)的一段內存空間。為鏈表節點申請到內存后,可以調用初始化LOS_ListInit(LOS_DL_LIST *list)方法,把這個節點鏈接為環狀的雙向鏈表。初始化鏈表時,只有一個鏈表節點,這個節點的前驅和后繼節點都是自身。鏈表節點初始化為鏈表,如圖所示:

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list) 
  2.     list->pstNext = list; 
  3.     list->pstPrev = list; 

 2.2 LOS_DL_LIST_HEAD(LOS_DL_LIST list)

除了LOS_ListInit(),還提供了一個相同功能的函數式宏LOS_DL_LIST_HEAD,通過直接定義一個雙向鏈表節點,實現將該節點初始化為雙向鏈表。區別于LOS_ListInit(),在調用函數式宏前,不需要動態申請內存空間。

  1. #define LOS_DL_LIST_HEAD(list) LOS_DL_LIST list = { &(list), &(list) } 

3 判斷空鏈表

3.1 LOS_ListEmpty(LOS_DL_LIST *list)

該內聯函數用于判斷鏈表是否為空。如果雙向鏈表的前驅/后繼節點均為自身,只有一個鏈節點,沒有掛載業務結構體的鏈表節點,稱該鏈表為空鏈表。

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC_INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *node) 
  2.     return (BOOL)(node->pstNext == node); 

 4 插入雙向鏈表節點

雙向鏈表提供三種鏈表節點插入方法,在指定鏈表節點后面插入LOS_ListAdd、尾部插入LOS_ListTailInsert、頭部插入LOS_ListHeadInsert。在頭部插入的節點,從頭部開始遍歷時第一個遍歷到,從尾部插入的節點,最后一個遍歷到。

4.1 LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node)

該內聯函數往鏈表節點*list所在的雙向鏈表中插入一個鏈表節點*node,插入位置在鏈表節點*list的后面。如圖所示,在插入過程中,會將*node的后繼節點設置為list->pstNext,*node的前驅節點為*list,并將list->pstNext的前驅節點從*list修改為*node,*list的后繼節點從list->pstNext修改為*node。

圖示:

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node) 
  2.     node->pstNext = list->pstNext; 
  3.     node->pstPrev = list; 
  4.     list->pstNext->pstPrev = node; 
  5.     list->pstNext = node; 

 4.2 LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)

該內聯函數往鏈表節點*list所在的雙向鏈表中插入一個鏈表節點*node,插入位置在鏈表節點*list的前面,list->pstPrev節點的后面。

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node) 
  2.     LOS_ListAdd(list->pstPrev, node); 

 4.3 LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)

該內聯函數和LOS_ListAdd()實現同樣的功能,往鏈表節點*list所在的雙向鏈表中插入一個鏈表節點*node,插入位置在鏈表節點*list的后面。

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node) 
  2.     LOS_ListAdd(list, node); 

 5 刪除雙向鏈表節點

雙向鏈表提供兩種鏈表節點的刪除方法,刪除指定節點LOS_ListDelete()、刪除并初始化為一個新鏈表LOS_ListDelInit()。

5.1 LOS_ListDelete(LOS_DL_LIST *node)

該內聯函數將鏈表節點*node從所在的雙向鏈表中刪除。節點刪除后,可能需要主動釋放節點所占用的內存。如圖所示,刪除節點過程中,會將*node的后繼節點的前驅改為*node的前驅節點,*node的前驅節點的后繼改為*node的后繼節點,并把*node節點的前驅、后繼節點設置為null,這樣*node節點就脫離了該雙向鏈表。

圖示:

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node) 
  2.     node->pstNext->pstPrev = node->pstPrev; 
  3.     node->pstPrev->pstNext = node->pstNext; 
  4.     node->pstNext = NULL
  5.     node->pstPrev = NULL

 5.2 LOS_ListDelInit(LOS_DL_LIST *list)

該內聯函數將鏈表節點*list從所在的雙向鏈表中刪除, 并把刪除后的節點重新初始化為一個新的雙向鏈表。

和LOS_ListDelete()類似,該函數也會將*list的后繼節點的前驅改為*list的前驅,*list的前驅節點的后繼改為*list的后繼,但不同的是,因為要重新初始化為新雙向鏈表,所以這個函數并不會把*list的前驅、后繼節點設置為null,而是把這個刪除的節點重新初始化為以*list為頭節點的新雙向鏈表。

源碼如下:

  1. LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelInit(LOS_DL_LIST *list) 
  2.     list->pstNext->pstPrev = list->pstPrev; 
  3.     list->pstPrev->pstNext = list->pstNext; 
  4.     LOS_ListInit(list); 

 6 獲取雙向鏈表節點

雙向鏈表還提供獲取鏈表節點、獲取包含鏈表的結構體地址的操作。

6.1 LOS_DL_LIST_LAST(object)

獲取指定鏈表節點的前驅節點。

源碼如下:

  1. #define LOS_DL_LIST_LAST(object) ((object)->pstPrev) 

6.2 LOS_DL_LIST_FIRST(object)

獲取指定鏈表節點的后繼節點。

源碼如下:

  1. #define LOS_DL_LIST_FIRST(object) ((object)->pstNext) 

 7 遍歷雙向循環鏈表節點

雙向循環鏈表提供兩種遍歷雙向鏈表的方法,LOS_DL_LIST_FOR_EACH和LOS_DL_LIST_FOR_EACH_SAFE。

7.1 LOS_DL_LIST_FOR_EACH(item, list)

該宏定義LOS_DL_LIST_FOR_EACH遍歷雙向鏈表,將每次循環獲取的鏈表節點保存在第一個入參中,第二個入參是要遍歷的雙向鏈表的起始節點。這個宏是個for循環條件,在每次循環中,獲取下一個鏈表節點保存到入參item。業務代碼寫在宏后面的代碼塊{}內。

源碼如下:

  1. #define LOS_DL_LIST_FOR_EACH(item, list) \ 
  2.     for ((item) = (list)->pstNext; (item) != (list); (item) = (item)->pstNext) 

 我們以實例演示如何使用LOS_DL_LIST_FOR_EACH。在kernel\src\los_task.c文件中,UINT32 OsPriqueueSize(UINT32 priority)函數的片段如下:

  1. STATIC UINT32 OsPriqueueSize(UINT32 priority) 
  2.     UINT32 itemCnt = 0; 
  3.     LOS_DL_LIST *curPQNode = (LOS_DL_LIST *)NULL
  4.  
  5. ⑴  LOS_DL_LIST_FOR_EACH(curPQNode, &g_losPriorityQueueList[priority]) { 
  6.         ++itemCnt; 
  7.     } 
  8.  
  9.     return itemCnt; 

 其中⑴處代碼,g_losPriorityQueueList[priority]是要循環遍歷的雙向鏈表,curPQNode指向遍歷過程中的鏈表節點。

7.2 LOS_DL_LIST_FOR_EACH_SAFE(item, next, list)

該宏定義LOS_DL_LIST_FOR_EACH_SAFE和LOS_DL_LIST_FOR_EACH的唯一區別就是多了一個入參next, 這個參數表示遍歷到的雙向鏈表節點的下一個節點。該宏用于安全刪除,如果刪除遍歷到的item, 不影響繼續遍歷。

源碼如下:

  1. #define LOS_DL_LIST_FOR_EACH_SAFE(item, next, list) \ 
  2.     for ((item) = (list)->pstNext, (next) = (item)->pstNext; (item) != (list); \ 
  3.             (item) = (next), (next) = (item)->pstNext) 

 8 獲取鏈表節點所在結構體

8.1 LOS_OFF_SET_OF(type, member)

根據結構體類型名稱type和其中的成員變量名稱member,獲取member成員變量相對于結構體type的內存地址偏移量。在鏈表的應用場景上,業務結構體包含雙向鏈表作為成員,當知道雙向鏈表成員變量的內存地址和相對于業務結構體的偏移時,就可以進一步獲取業務結構體的內存地址,具體見下面LOS_DL_LIST_ENTRY的宏實現。

源碼如下:

  1. #define LOS_OFF_SET_OF(type, member) ((UINTPTR)&((type *)0)->member) 

 8.2 LOS_DL_LIST_ENTRY(item, type, member)

函數宏中的三個參數分別為:業務結構體類型名稱type,作為結構體成員的雙向鏈表成員變量名稱member,作為結構體成員的雙向鏈表節點指針item。通過調用該宏函數LOS_DL_LIST_ENTRY即可以獲取雙向鏈表節點所在的業務結構體的內存地址。

源碼如下:

基于雙向鏈表節點的內存地址,和雙向鏈表成員變量在結構體中的地址偏移量,可以計算出結構體的內存地址。

  1. #define LOS_DL_LIST_ENTRY(item, type, member) \ 
  2.     ((type *)(VOID *)((CHAR *)(item) - LOS_OFF_SET_OF(type, member))) 

 9 遍歷包含雙向鏈表的結構體

雙向鏈表提供三個宏定義來遍歷包含雙向鏈表成員的結構體,LOS_DL_LIST_FOR_EACH_ENTRY、LOS_DL_LIST_FOR_EACH_ENTRY_SAFE和LOS_DL_LIST_FOR_EACH_ENTRY_HOOK。

9.1 LOS_DL_LIST_FOR_EACH_ENTRY(item, list, type, member)

該宏定義LOS_DL_LIST_FOR_EACH_ENTRY通過遍歷雙向鏈表,在每次循環中獲取包含該雙向鏈表成員的結構體變量并保存在第一個入參中。第二個入參是要遍歷的雙向鏈表的起始節點,第三個入參是要獲取的結構體類型名稱,第四個入參是該結構體中的雙向鏈表成員變量的名稱。這個宏是個for循環條件,業務代碼寫在宏后面的代碼塊{}內。

源碼如下:

for循環的初始化語句item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member)表示獲取包含雙向鏈表第一個有效節點的結構體,并保存到指針變量item中。條件測試語句&(item)->member != (list)表示當雙向鏈表遍歷一圈到自身節點時,停止循環。循環更新語句item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))中,使用(item)->member.pstNext遍歷到下一個鏈表節點,然后根據這個節點獲取對應的下一個結構體的指針變量item,直至遍歷完畢。

  1. #define LOS_DL_LIST_FOR_EACH_ENTRY(item, list, type, member)             \ 
  2.     for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member);        \ 
  3.          &(item)->member != (list);                                      \ 
  4.          item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member)) 

 9.2 LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)

該宏定義和LOS_DL_LIST_FOR_EACH_ENTRY的唯一區別就是多了一個入參next, 這個參數表示遍歷到的結構體的下一個結構體。該宏用于安全刪除,如果刪除遍歷到的item,不影響繼續遍歷。

源碼如下:

  1. #define LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)               \ 
  2.     for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member),                     \ 
  3.          next = LOS_DL_LIST_ENTRY((item)->member->pstNext, type, member);             \ 
  4.          &(item)->member != (list);                                                   \ 
  5.          item = nextnext = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member)) 

 9.3 LOS_DL_LIST_FOR_EACH_ENTRY_HOOK(item, list, type, member, hook)

該宏定義和LOS_DL_LIST_FOR_EACH_ENTRY的區別就是多了一個入參hook,hook表示鉤子函數。在每次遍歷循環中,會調用該鉤子函數,實現用戶任務的定制。

源碼如下:

  1. #define LOS_DL_LIST_FOR_EACH_ENTRY_HOOK(item, list, type, member, hook)  \ 
  2.     for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member), hook;  \ 
  3.          &(item)->member != (list);                                      \ 
  4.          item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member), hook) 

 小結

掌握鴻蒙輕內核的雙向循環鏈表LOS_DL_LIST這一重要的數據結構,會給進一步學習、分析鴻蒙輕內核源代碼打下了基礎,讓后續的學習更加容易。后續也會陸續推出更多的分享文章,敬請期待,也歡迎大家分享學習、使用鴻蒙輕內核的心得,有任何問題、建議,都可以留言給我們: https://gitee.com/openharmony/kernel_liteos_m/issues 。為了更容易找到鴻蒙輕內核代碼倉,建議訪問 https://gitee.com/openharmony/kernel_liteos_m ,關注Watch、點贊Star、并Fork到自己賬戶下,謝謝。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-05-10 15:05:56

鴻蒙HarmonyOS應用

2021-05-12 09:45:20

鴻蒙HarmonyOS應用

2021-06-17 09:36:07

鴻蒙HarmonyOS應用

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-03 18:28:28

Harmony進程任務管理模塊

2021-07-06 09:45:03

鴻蒙HarmonyOS應用

2021-09-22 14:36:32

鴻蒙HarmonyOS應用

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

亚洲av毛片在线观看| 亚洲影院色无极综合| 特级西西www444人体聚色| 成人一区视频| 亚洲黄色性网站| 欧美xxxx黑人又粗又长密月| 一区不卡在线观看| 亚洲日本国产| 日韩亚洲成人av在线| 理论片大全免费理伦片| 三级成人黄色影院| 亚洲国产综合视频在线观看| 深夜福利成人| 熟妇人妻系列aⅴ无码专区友真希| 日韩成人午夜精品| 久久久久久久91| 又嫩又硬又黄又爽的视频| 红杏aⅴ成人免费视频| 欧美午夜片在线观看| 黄网站欧美内射| xvideos国产在线视频| 久久这里只有精品视频网| 99国产视频| 最近中文字幕av| 性欧美暴力猛交另类hd| 欧美大秀在线观看| 国产大屁股喷水视频在线观看| 日本一道高清一区二区三区| 日韩欧美激情一区| 国产福利精品一区二区三区| 欧美日韩成人影院| 欧美日韩黄色大片| 成人精品视频在线播放| 污的网站在线观看| 国产精品久久久久一区二区三区| 欧美日韩精品免费观看| 国产香蕉在线观看| 国产精品一区二区果冻传媒| 国产综合久久久久久| 波多野结衣二区三区| 先锋影音久久久| 97在线观看视频| 日本一二三区不卡| 亚洲性感美女99在线| 欧美成人免费视频| 日本妇女毛茸茸| 亚洲精品一二三区区别| 精品国内亚洲在观看18黄 | 日韩经典在线观看| 欧美日韩精选| 欧美高清视频在线| 免费一级a毛片夜夜看| 亚洲一区 二区 三区| 色偷偷偷综合中文字幕;dd| 91资源在线播放| 日韩精品永久网址| www.日韩视频| 一区二区成人免费视频| 一区二区三区在线观看免费| 久久视频这里只有精品| 国产大学生自拍| 国产一区日韩欧美| 国模极品一区二区三区| www日韩精品| 玖玖精品视频| 国产一区视频在线| www.成人精品| 成人动漫一区二区| 欧美日韩最好看的视频| 91电影在线播放| 亚洲三级视频在线观看| 精品人妻人人做人人爽| aaa在线播放视频| 日韩欧美国产视频| 中文字幕永久有效| 日本一区二区乱| 亚洲高清不卡av| 色无极影院亚洲| 四虎成人av| 欧美劲爆第一页| 亚洲影院在线播放| 久久se这里有精品| 国产欧美亚洲日本| 国产一区电影| 亚洲视频免费在线观看| av网站大全免费| 浪潮色综合久久天堂| 欧美精品日韩一本| 中文字幕a在线观看| av中文一区| 欧美黑人国产人伦爽爽爽| 日韩 国产 欧美| 激情久久五月天| 久99久在线| 九义人在线观看完整免费版电视剧| 亚洲国产精品麻豆| 污污网站免费看| 精品无人区一区二区| 永久555www成人免费| 久久久久久久黄色| 蜜桃精品在线观看| 国产精品香蕉视屏| 欧美性videos| 欧美性猛交99久久久久99按摩| 一级黄色片国产| 亚洲高清极品| 欧美激情a在线| 亚洲在线免费观看视频| 北条麻妃一区二区三区| 一区二区三区视频| 美女av在线免费看| 欧美一激情一区二区三区| 91成人破解版| 国产欧美亚洲一区| 91入口在线观看| 一级毛片视频在线观看| 色综合中文字幕| 色哟哟视频在线| 亚洲精品网址| 国产在线久久久| 激情福利在线| 欧美性色xo影院| 人妖粗暴刺激videos呻吟| 欧美3p在线观看| 国产精品电影在线观看| 日产精品久久久久久久性色| 亚洲另类春色国产| 亚洲精品视频三区| 成人情趣视频| 日韩免费在线视频| 天堂影院在线| 午夜精品久久久久久久99樱桃| 日本55丰满熟妇厨房伦| 欧美顶级大胆免费视频| 国产黑人绿帽在线第一区| 亚洲 欧美 精品| 亚洲成人免费观看| 扒开伸进免费视频| 亚洲私人影院| aa日韩免费精品视频一| 任你弄在线视频免费观看| 宅男噜噜噜66一区二区66| 国产精品情侣呻吟对白视频| 日韩 欧美一区二区三区| 欧美精品一区在线| 欧美日韩电影免费看| 日韩久久免费视频| 国产伦精品一区二区三区视频网站| 91蜜桃传媒精品久久久一区二区| 国产资源在线视频| 西野翔中文久久精品国产| 91精品国产亚洲| 日韩美女一级视频| 在线免费精品视频| 91精品国自产在线| 麻豆视频一区二区| av电影一区二区三区| 日韩一级特黄| 欧美大片在线免费观看| 国精品人妻无码一区二区三区喝尿 | 日韩国产欧美三级| 色一情一乱一伦一区二区三区丨 | 91精品国产欧美一区二区| 大地资源高清在线视频观看| 韩国av一区二区三区在线观看| 免费国产成人看片在线| 一区二区网站| 欧美一级片免费在线| 成全电影播放在线观看国语| 欧美日韩国产三级| 欧美人与禽zozzo禽性配| 成人午夜大片免费观看| 少妇高潮喷水久久久久久久久久| 欧美日韩国产在线观看网站| 国产在线不卡精品| 国产盗摄一区二区| 亚洲精品一区av在线播放| 国产精品欧美综合| 亚洲精品中文字幕在线观看| 怡红院一区二区| 日本在线观看不卡视频| 亚洲高潮无码久久| 日韩深夜福利| 国产噜噜噜噜噜久久久久久久久| 亚洲男同gay网站| 国产网站欧美日韩免费精品在线观看| 91麻豆精品在线| 亚洲综合免费观看高清完整版在线| 亚洲AV无码国产精品| 六月丁香婷婷色狠狠久久| 欧美精品在欧美一区二区| 性欧美xxxx免费岛国不卡电影| 国产精品一区久久久| 欧美日韩色网| 中文字幕国产亚洲2019| 天堂中文在线看| 欧美精品丝袜久久久中文字幕| 日韩女优在线观看| 国产精品激情偷乱一区二区∴| 精品人妻在线视频| 麻豆久久久久久| 免费看一级大黄情大片| 亚洲一区二区三区| 日韩av不卡播放| 国产一区二区在线视频你懂的| 国产精品尤物福利片在线观看| 草草视频在线观看| 久久精品国产欧美激情| 日本高清中文字幕二区在线| 日韩免费成人网| 在线免费av网| 日韩欧美视频一区二区三区| 免费在线黄色片| 日韩一区中文字幕| www在线观看免费视频| 成人激情午夜影院| 亚洲xxxx做受欧美| 亚洲精品性视频| 中文在线一区二区三区| 免费在线观看一区二区三区| 国产一线二线三线女| 国产精品成人av| 日韩精品久久久| 先锋影音国产精品| 精品一区二区三区自拍图片区| 欧美一级片网址| 国产女人18毛片水18精品| 欧美舌奴丨vk视频| 97精品一区二区视频在线观看| 八戒八戒神马在线电影| 日韩中文字幕免费| 一级毛片视频在线| 揄拍成人国产精品视频| 日本精品专区| 亚洲精选中文字幕| 日漫免费在线观看网站| 日韩精品高清在线观看| 色呦呦免费观看| 亚洲а∨天堂久久精品喷水| 亚洲经典一区二区| 精品久久久久久久久久久院品网| 99久久精品国产一区二区成人| 欧美日韩另类国产亚洲欧美一级| 中文字幕+乱码+中文| 在线观看视频一区二区欧美日韩| 中文字幕精品视频在线观看| 色综合久久综合网欧美综合网 | 舔着乳尖日韩一区| 日本五十熟hd丰满| 精品动漫一区二区三区| 久久午夜免费视频| 日韩欧美在线中文字幕| 高清乱码免费看污| 欧洲精品视频在线观看| 中文字幕人成人乱码亚洲电影| 欧美视频一区二| 国产精品人妻一区二区三区| 91精品国产全国免费观看| 亚洲国产精品久久久久久6q| 欧美精品一区二区三区蜜桃| 日本福利片在线| 中文字幕av一区二区三区谷原希美| 天堂аⅴ在线地址8| 久热爱精品视频线路一| 超碰中文在线| 国产成人精品视| 亚洲成人1区| 国产精品毛片一区视频| 亚洲桃色综合影院| 亚洲一区二区在线观| 欧美在线黄色| 日韩欧美一区二| 秋霞午夜鲁丝一区二区老狼| 亚洲网中文字幕| www.亚洲精品| 国产18无套直看片| 一区二区三区加勒比av| 欧美三级一区二区三区| 欧美日韩五月天| 欧美一区二区公司| 一区二区三区日韩在线| 91香蕉在线观看| 57pao国产精品一区| 四虎地址8848精品| 国产在线一区二区三区欧美| 欧美一级本道电影免费专区| 日本a级片在线观看| 久久精品盗摄| 蜜桃视频无码区在线观看| 26uuu另类欧美| www.99re7| 日本韩国一区二区三区视频| 国产欧美一级片| 精品国产一级片| 国产一区二区美女视频| www在线观看黄色| 国产日韩精品综合网站| 乱亲女h秽乱长久久久| 亚洲日本japanese丝袜| 国产一区91| 亚洲精品一二三四| 欧美极品美女视频| xxxx 国产| 欧美一区二区三区免费大片| 国产在线超碰| 国内精品400部情侣激情| 色综合.com| 日本在线观看一区二区| 在线日韩电影| 欧美一级特黄aaa| 国产三级精品在线| 日韩毛片在线视频| 日韩欧美综合在线| 香蕉视频免费在线播放| 国产精品av在线| 伊人久久大香线蕉av不卡| a级片一区二区| 久久国产日韩欧美精品| 无码少妇一区二区| 懂色av影视一区二区三区| 亚洲精品一区二区口爆| 久久久精品999| 一区二区三区日本视频| 日韩国产高清一区| 老司机精品久久| 性久久久久久久久久| 亚洲成人在线观看视频| 亚洲国产精品成人久久蜜臀| 久久成年人免费电影| 亚洲色图综合| 一区二区三区四区免费视频| 日日噜噜夜夜狠狠视频欧美人| 亚洲の无码国产の无码步美| 亚洲成人免费电影| 蜜臀久久久久久999| 欧美激情a∨在线视频播放| 国产区一区二| 麻豆映画在线观看| 国产高清精品在线| 九九九免费视频| 欧美mv和日韩mv国产网站| 天天色天天射天天综合网| 亚洲自拍欧美色图| 一区二区三区在线| 中文字幕一区二区三区人妻在线视频 | 久久成人18免费观看| 无码人妻精品中文字幕| 欧美精三区欧美精三区| 免费在线观看av| 114国产精品久久免费观看| 在线精品国产| 少妇伦子伦精品无吗| 亚洲成人免费视| 免费成人av电影| 国产精品一区二区三| 久久久人成影片免费观看| 波多野结衣中文字幕在线播放| 一区二区三区欧美在线观看| 欧美一级片免费| 日本高清+成人网在线观看| 成人vr资源| 特级黄色片视频| 婷婷丁香激情综合| 九色视频在线观看免费播放| 国产精品亚洲片夜色在线| 99久久www免费| 国产在线观看免费播放| 黑人巨大精品欧美一区二区一视频| 国产日本在线| 91亚洲精品在线观看| 一区在线视频观看| 97超碰在线资源| 在线不卡免费av| 2020国产在线| 亚洲精品一卡二卡三卡四卡| 国产精品一二三四区| 久久99国产综合精品免费| 在线中文字幕日韩| av在线亚洲色图| 欧美精品一区二区三区免费播放| 136国产福利精品导航| 天天干视频在线观看| 国产精彩精品视频| 欧美jjzz| av电影在线不卡| 欧美α欧美αv大片| 久久天堂av| 人妻av无码专区| 亚洲国产高清aⅴ视频| 亚洲av无码国产综合专区| 国产精品高潮粉嫩av| 黄色日韩在线| 99久久99久久精品免费| 亚洲第一视频网| 九九久久国产| 日韩av资源在线| 亚洲一区二区在线播放相泽| 国产大学生校花援交在线播放| 国产精品传媒毛片三区| 秋霞国产午夜精品免费视频|