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

鴻蒙輕內核M核源碼分析系列三數據結構-任務排序鏈表

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

[[398560]]

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

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

https://harmonyos.51cto.com

在鴻蒙輕內核源碼分析系列一和系列二,我們分析了雙向循環鏈表、優先級就緒隊列的源碼。本文會繼續給讀者介紹鴻蒙輕內核源碼中重要的數據結構:任務排序鏈表TaskSortLinkAttr。鴻蒙輕內核的任務排序鏈表,用于任務延遲到期/超時喚醒等業務場景,是一個非常重要、非常基礎的數據結構。

1 任務排序鏈表

我們先看下任務排序鏈接的數據結構。任務排序鏈表是一個環狀的雙向鏈表數組,任務排序鏈表屬性結構體TaskSortLinkAttr作為雙向鏈表的頭結點,指向雙向鏈表數組的第一個元素,還維護游標信息,記錄當前的位置信息。我們先看下排序鏈表屬性的結構體的定義。

1.1 任務排序鏈表屬性結構體定義

在kernel\include\los_task.h頭文件中定義了排序鏈表屬性的結構體TaskSortLinkAttr。該結構體定義了排序鏈表的頭節點LOS_DL_LIST *sortLink,游標UINT16 cursor,還有一個保留字段,暫時沒有使用。

源碼如下:

  1. typedef struct { 
  2.     LOS_DL_LIST *sortLink; 
  3.     UINT16      cursor
  4.     UINT16      reserved; 
  5. } TaskSortLinkAttr; 

 在文件kernel\src\los_task.c中定義了排序鏈表屬性結構體TaskSortLinkAttr類型的全局變量g_taskSortLink,該全局變量的成員變量sortLink作為排序鏈表的頭結點,指向一個長度為32的環狀的雙向鏈表數組,成員變量cursor作為游標記錄環狀數組的當前游標位置。源代碼如下。

  1. LITE_OS_SEC_BSS  TaskSortLinkAttr                    g_taskSortLink; 

 我們使用示意圖來講述一下。任務排序鏈表是環狀雙向鏈表數組,長度為32,每一個元素是一個雙向鏈表,掛載任務LosTaskCB的鏈表節點timerList。任務LosTaskCB的成員變量idxRollNum記錄數組的索引和滾動數。全局變量g_taskSortLink的成員變量cursor記錄當前游標位置,每過一個Tick,游標指向下一個位置,轉一輪需要32 ticks。當運行到的數組位置,雙向鏈表不為空,則把第一個節點維護的滾動數減1。這樣的數據結構類似鐘表表盤,也稱為時間輪。

我們舉個例子來說明,基于時間輪實現的任務排序鏈表是如何管理任務延遲超時的。假如當前游標cursor為1,當一個任務需要延時72 ticks,72=2*32+8,表示排序索引sortIndex為8,滾動數rollNum為2。會把任務插入數組索引為sortIndex+cursor=9的雙向鏈表位置,索要9處的雙向鏈表維護節點的滾動為2。隨著Tick時間的進行,從當前游標位置運行到數組索引位置9,歷時8 ticks。運行到9時,如果滾動數大于0,則把滾動數減1。等再運行2輪,共需要72 ticks,任務就會延遲到期,可以從排序鏈表移除。每個數組元素對應的雙向鏈表的第一個鏈表節點的滾動數表示需要轉多少輪,節點任務才到期。第二個鏈表節點的滾動數需要加上第一個節點的滾動數,表示第二個節點需要轉的輪數。依次類推。

示意圖如下:

1.2 任務排序鏈表宏定義

在OS_TSK_SORTLINK_LEN頭文件中定義了一些和任務排序鏈表相關的宏定義。延遲任務雙向鏈表數組的長度定義為32,高階bit位位數為5,低階bit位位數為27。對于任務的超時時間,取其高27位作為滾動數,低5位作為數組索引。

源碼如下:

  1. /** 
  2. * 延遲任務雙向鏈表數組的數量(桶的數量):32 
  3. */ 
  4. #define OS_TSK_SORTLINK_LEN                         32 
  5.  
  6. /** 
  7. * 高階bit位數目:5 
  8. */ 
  9. #define OS_TSK_HIGH_BITS                            5U 
  10.  
  11. /** 
  12. * 低階bit位數目:27 
  13. */ 
  14. #define OS_TSK_LOW_BITS                             (32U - OS_TSK_HIGH_BITS) 
  15.  
  16. /** 
  17. * 滾動數最大值:0xFFFF FFDF,1111 0111 1111 1111 1111 1111 1101 1111 
  18. */ 
  19. #define OS_TSK_MAX_ROLLNUM                          (0xFFFFFFFFU - OS_TSK_SORTLINK_LEN) 
  20.  
  21. /** 
  22. * 任務延遲時間數的位寬:5 
  23. */ 
  24. #define OS_TSK_SORTLINK_LOGLEN                      5 
  25.  
  26. /** 
  27. * 延遲任務的桶編號的掩碼:31、0001 1111 
  28. */ 
  29. #define OS_TSK_SORTLINK_MASK                        (OS_TSK_SORTLINK_LEN - 1U) 
  30.  
  31. /** 
  32. * 滾動數的高階掩碼:1111 1000 0000 0000 0000 0000 0000 0000 
  33. */ 
  34. #define OS_TSK_HIGH_BITS_MASK                       (OS_TSK_SORTLINK_MASK << OS_TSK_LOW_BITS) 
  35.  
  36. /** 
  37. * 滾動數的低階掩碼:0000 0111 1111 1111 1111 1111 1111 1111 
  38. */ 
  39. #define OS_TSK_LOW_BITS_MASK                        (~OS_TSK_HIGH_BITS_MASK) 

 2 任務排序鏈表操作

我們分析下任務排序鏈表的操作,包含初始化,插入,刪除,滾動數更新,獲取下一個到期時間等。

2.1 初始化排序鏈表

在系系統內核初始化啟動階段,在函數UINT32 OsTaskInit(VOID)中初始化任務排序鏈表。該函數的調用關系如下,main.c:main() --> kernel\src\los_init.c:LOS_KernelInit() --> kernel\src\los_task.c:OsTaskInit()。

初始化排序鏈表函數的源碼如下:

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsTaskInit(VOID) 
  2.     UINT32 size
  3.     UINT32 index
  4.     LOS_DL_LIST *listObject = NULL
  5.     ...... 
  6. ⑴  size = sizeof(LOS_DL_LIST) * OS_TSK_SORTLINK_LEN; 
  7.     listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); 
  8. ⑵  if (listObject == NULL) { 
  9.         (VOID)LOS_MemFree(m_aucSysMem0, g_taskCBArray); 
  10.         return LOS_ERRNO_TSK_NO_MEMORY; 
  11.     } 
  12.  
  13. ⑶  (VOID)memset_s((VOID *)listObject, size, 0, size); 
  14. ⑷  g_taskSortLink.sortLink = listObject; 
  15.     g_taskSortLink.cursor = 0; 
  16.     for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) { 
  17. ⑸      LOS_ListInit(listObject); 
  18.     } 
  19.  
  20.     return LOS_OK; 

⑴處代碼計算需要申請的雙向鏈表的內存大小,OS_TSK_SORTLINK_LEN為32,即需要為32個雙向鏈表節點申請內存空間。然后申請內存,⑵處申請內存失敗時返回相應錯誤碼。⑶處初始化申請的內存區域為0等。⑷處把申請的雙向鏈表節點賦值給g_taskSortLink的鏈表節點.sortLink,作為排序鏈表的頭節點,游標.cursor初始化為0。然后⑸處的循環,調用LOS_ListInit()函數把雙向鏈表數組每個元素都初始化為雙向循環鏈表。

2.2 插入排序鏈表

插入排序鏈表的函數為OsTaskAdd2TimerList()。在任務等待互斥鎖/信號量等資源時,都需要調用該函數將任務加入到對應的排序鏈表中。該函數包含兩個入參,第一個參數LosTaskCB *taskCB用于指定要延遲的任務,第二個參數UINT32 timeout指定超時等待時間。

源碼如下:

  1. LITE_OS_SEC_TEXT VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout) 
  2.     LosTaskCB *taskDelay = NULL
  3.     LOS_DL_LIST *listObject = NULL
  4.     UINT32 sortIndex; 
  5.     UINT32 rollNum; 
  6.  
  7. ⑴  sortIndex = timeout & OS_TSK_SORTLINK_MASK; 
  8.     rollNum = (timeout >> OS_TSK_SORTLINK_LOGLEN); 
  9. ⑵  (sortIndex > 0) ? 0 : (rollNum--); 
  10. ⑶  EVALUATE_L(taskCB->idxRollNum, rollNum); 
  11. ⑷  sortIndex = (sortIndex + g_taskSortLink.cursor); 
  12.     sortIndex = sortIndex & OS_TSK_SORTLINK_MASK; 
  13. ⑸  EVALUATE_H(taskCB->idxRollNum, sortIndex); 
  14. ⑹  listObject = g_taskSortLink.sortLink + sortIndex; 
  15. ⑺  if (listObject->pstNext == listObject) { 
  16.         LOS_ListTailInsert(listObject, &taskCB->timerList); 
  17.     } else { 
  18. ⑻      taskDelay = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList); 
  19.         do { 
  20. ⑼          if (UWROLLNUM(taskDelay->idxRollNum) <= UWROLLNUM(taskCB->idxRollNum)) { 
  21.                 UWROLLNUMSUB(taskCB->idxRollNum, taskDelay->idxRollNum); 
  22.             } else { 
  23. ⑽              UWROLLNUMSUB(taskDelay->idxRollNum, taskCB->idxRollNum); 
  24.                 break; 
  25.             } 
  26.  
  27. ⑾          taskDelay = LOS_DL_LIST_ENTRY(taskDelay->timerList.pstNext, LosTaskCB, timerList); 
  28.         } while (&taskDelay->timerList != (listObject)); 
  29.  
  30. ⑿      LOS_ListTailInsert(&taskDelay->timerList, &taskCB->timerList); 
  31.     } 

 ⑴處代碼計算等待時間timeout的低5位作為數組索引,高27位作為滾動數rollNum。這2行代碼數學上的意義,就是把等待時間處于32得到的商作為滾動數,余數作為數組索引。⑵處代碼,如果余數為0,可以整除時,滾動數減1。減1設計的原因是,在函數VOID OsTaskScan(VOID)中,每一個tick到來時,如果滾動數大于0,滾動數減1,并繼續滾動一圈。后文會分析該函數VOID OsTaskScan(VOID)。

⑶處代碼把滾動數賦值給任務taskCB->idxRollNum的低27位。⑷處把數組索引加上游標,然后執行⑸賦值給任務taskCB->idxRollNum的高5位。⑹根據數組索引獲取雙向鏈表頭結點,⑺如果此處雙向鏈表為空,直接插入鏈表里。如果鏈表不為空,執行⑻獲取第一個鏈表節點對應的任務taskDelay,然后遍歷循環雙向鏈表,把任務插入到合適的位置。⑼處如果待插入任務taskCB的滾動數大于等于當前鏈表節點對應任務的滾動數,則從待插入任務taskCB的滾動數中減去當前鏈表節點對應任務的滾動數,然后執行⑾獲取下一個節點繼續遍歷。⑽處如果待插入任務taskCB的滾動數小于當前鏈表節點對應任務的滾動數,則從當前鏈表節點對應任務的滾動數中減去待插入任務taskCB的滾動數,然后跳出循環。執行⑿,完成任務插入。插入過程,可以結合上文的示意圖進行理解。

2.3 從排序鏈表中刪除

從排序鏈表中刪除的函數為VOID OsTimerListDelete(LosTaskCB *taskCB)。在任務恢復/刪除等場景中,需要調用該函數將任務從任務排序鏈表中刪除。該函數包含一個參數LosTaskCB *taskCB,用于指定要從排序鏈表中刪除的任務。

源碼如下:

  1. LITE_OS_SEC_TEXT VOID OsTimerListDelete(LosTaskCB *taskCB) 
  2.     LOS_DL_LIST  *listObject = NULL
  3.     LosTaskCB  *nextTask = NULL
  4.     UINT32 sortIndex; 
  5.  
  6. ⑴  sortIndex = UWSORTINDEX(taskCB->idxRollNum); 
  7. ⑵  listObject = g_taskSortLink.sortLink + sortIndex; 
  8.  
  9. ⑶  if (listObject != taskCB->timerList.pstNext) { 
  10. ⑷      nextTask = LOS_DL_LIST_ENTRY(taskCB->timerList.pstNext, LosTaskCB, timerList); 
  11.         UWROLLNUMADD(nextTask->idxRollNum, taskCB->idxRollNum); 
  12.     } 
  13.  
  14. ⑸  LOS_ListDelete(&taskCB->timerList); 

 ⑴處代碼獲取待從排序鏈表中刪除的任務對應的數字索引。⑵處代碼獲取排序鏈表的頭節點listObject。⑶處代碼判斷待刪除節點是否是最后一個節點,如果不是最后一個節點,執行執行⑷處代碼獲取待刪除節點的下一個節點對應的任務nextTask,在下一個節點的滾動數中增加待刪除節點的滾動數,然后執行⑸處代碼執行刪除操作。如果是最后一個節點,直接執行⑸處代碼刪除該節點即可。

2.4 獲取下一個超時到期時間

獲取下一個超時到期時間的函數為OsTaskNextSwitchTimeGet(),我們分析下其代碼。

源碼如下:

  1. UINT32 OsTaskNextSwitchTimeGet(VOID) 
  2.     LosTaskCB *taskCB = NULL
  3.     UINT32 taskSortLinkTick = LOS_WAIT_FOREVER; 
  4.     LOS_DL_LIST *listObject = NULL
  5.     UINT32 tempTicks; 
  6.     UINT32 index
  7.  
  8. ⑴  for (index = 0; index < OS_TSK_SORTLINK_LEN; index++) { 
  9. ⑵      listObject = g_taskSortLink.sortLink + ((g_taskSortLink.cursor + index) % OS_TSK_SORTLINK_LEN); 
  10. ⑶      if (!LOS_ListEmpty(listObject)) { 
  11. ⑷          taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList); 
  12. ⑸          tempTicks = (index == 0) ? OS_TSK_SORTLINK_LEN : index
  13. ⑹          tempTicks += (UINT32)(UWROLLNUM((UINT32)taskCB->idxRollNum) * OS_TSK_SORTLINK_LEN); 
  14. ⑺          if (taskSortLinkTick > tempTicks) { 
  15.                 taskSortLinkTick = tempTicks; 
  16.             } 
  17.         } 
  18.     } 
  19.     return taskSortLinkTick; 

 ⑴處代碼循環遍歷雙向鏈表數組,⑵處代碼從當前游標位置開始獲取排序鏈表的頭節點listObject。⑶處代碼判斷排序鏈表是否為空,如果排序鏈表為空,則繼續遍歷下一個數組。如果鏈表不為空,⑷處代碼獲取排序鏈表的第一個鏈表節點對應的任務。⑸處如果遍歷的數字索引為0,tick數目使用32,否則使用具體的數字索引。⑹處獲取任務的滾動數,計算出需要的等待時間,加上⑸處計算出的不足滾動一圈的時間。⑺處計算出需要等待的最小時間,即下一個最快到期的時間。

3 排序鏈表和Tick時間的關系

任務加入到排序鏈表后,時間一個tick一個tick的逝去,排序鏈表中的滾動數該如何更新呢?

時間每走過一個tick,系統就會調用Tick中斷的處理函數OsTickHandler(),該函數在kernel\src\los_tick.c文件中實現。下面是該函數的代碼片段,⑴處代碼分別任務的超時到期情況。

  1. LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) 
  2. #if (LOSCFG_BASE_CORE_TICK_HW_TIME == 1) 
  3.     platform_tick_handler(); 
  4. #endif 
  5.  
  6.     g_ullTickCount++; 
  7.  
  8. #if (LOSCFG_BASE_CORE_TIMESLICE == 1) 
  9.     OsTimesliceCheck(); 
  10. #endif 
  11.  
  12. ⑴  OsTaskScan();  // task timeout scan 
  13.  
  14. #if (LOSCFG_BASE_CORE_SWTMR == 1) 
  15.     (VOID)OsSwtmrScan(); 
  16. #endif 

 詳細分析下函數OsTaskScan(),來了解排序鏈表和tick時間的關系。函數在kernel\base\los_task.c文件中實現,代碼片段如下:

  1. LITE_OS_SEC_TEXT VOID OsTaskScan(VOID) 
  2.     LosTaskCB *taskCB = NULL
  3.     BOOL needSchedule = FALSE
  4.     LOS_DL_LIST *listObject = NULL
  5.     UINT16 tempStatus; 
  6.     UINTPTR intSave; 
  7.     intSave = LOS_IntLock(); 
  8.  
  9. ⑴  g_taskSortLink.cursor = (g_taskSortLink.cursor + 1) % OS_TSK_SORTLINK_LEN; 
  10.     listObject = g_taskSortLink.sortLink + g_taskSortLink.cursor
  11. ⑵  if (listObject->pstNext == listObject) { 
  12.         LOS_IntRestore(intSave); 
  13.         return
  14.     } 
  15.  
  16. ⑶  for (taskCB = LOS_DL_LIST_ENTRY((listObject)->pstNext, LosTaskCB, timerList); 
  17.          &taskCB->timerList != (listObject);) { 
  18.         tempStatus = taskCB->taskStatus; 
  19. ⑷      if (UWROLLNUM(taskCB->idxRollNum) > 0) { 
  20.             UWROLLNUMDEC(taskCB->idxRollNum); 
  21.             break; 
  22.         } 
  23.  
  24. ⑸      LOS_ListDelete(&taskCB->timerList); 
  25. ⑹      if (tempStatus & OS_TASK_STATUS_PEND) { 
  26.             taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND); 
  27.             LOS_ListDelete(&taskCB->pendList); 
  28.             taskCB->taskSem = NULL
  29.             taskCB->taskMux = NULL
  30.         } 
  31. ⑺      else if (tempStatus & OS_TASK_STATUS_EVENT) { 
  32.             taskCB->taskStatus &= ~(OS_TASK_STATUS_EVENT); 
  33.         } 
  34. ⑻      else if (tempStatus & OS_TASK_STATUS_PEND_QUEUE) { 
  35.             LOS_ListDelete(&taskCB->pendList); 
  36.             taskCB->taskStatus &= ~(OS_TASK_STATUS_PEND_QUEUE); 
  37.         } else { 
  38.             taskCB->taskStatus &= ~(OS_TASK_STATUS_DELAY); 
  39.         } 
  40.  
  41. ⑼      if (!(tempStatus & OS_TASK_STATUS_SUSPEND)) { 
  42.             taskCB->taskStatus |= OS_TASK_STATUS_READY; 
  43.             OsHookCall(LOS_HOOK_TYPE_MOVEDTASKTOREADYSTATE, taskCB); 
  44.             OsPriqueueEnqueue(&taskCB->pendList, taskCB->priority); 
  45.             needSchedule = TRUE
  46.         } 
  47.  
  48.         if (listObject->pstNext == listObject) { 
  49.             break; 
  50.         } 
  51.  
  52.         taskCB = LOS_DL_LIST_ENTRY(listObject->pstNext, LosTaskCB, timerList); 
  53.     } 
  54.  
  55.     LOS_IntRestore(intSave); 
  56.  
  57. ⑽  if (needSchedule) { 
  58.         LOS_Schedule(); 
  59.     } 

 ⑴處代碼更新全局變量g_taskSortLink的游標,指向雙向鏈表數組下一個位置,然后獲取該位置的雙向鏈表頭結點listObject。⑵如果鏈表為空,則返回。如果雙向鏈表不為空,則執行⑶循環遍歷每一個鏈表節點。⑷處如果鏈表節點的滾動數大于0,則滾動數減1,說明任務還需要繼續等待一輪。如果鏈表節點的滾動數等于0,說明任務超時到期,執行⑸從排序鏈表中刪除。接下來需要根據任務狀態分別處理,⑹處如果代碼是阻塞狀態,取消阻塞狀態,并從阻塞鏈表中刪除。⑺處如果任務阻塞在事件中,取消阻塞狀態。⑻如果任務阻塞在隊列,從阻塞鏈表中刪除,取消阻塞狀態,如果不是上述狀態,取消延遲狀態OS_TASK_STATUS_DELAY。⑼處如果代碼是掛起狀態,設置任務為就緒狀態,加入任務就緒隊列,設置需要重新調度標記。⑽如果設置需要重新調度,調用調度函數觸發任務調度。

小結

掌握鴻蒙輕內核的排序鏈表TaskSortLinkAttr這一重要的數據結構,會給進一步學習、分析鴻蒙輕內核源代碼打下了基礎,讓后續的學習更加容易。

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

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

https://harmonyos.51cto.com

 

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

2021-04-30 15:06:34

鴻蒙HarmonyOS應用

2021-05-12 09:45:20

鴻蒙HarmonyOS應用

2021-06-17 09:36:07

鴻蒙HarmonyOS應用

2021-05-13 09:47:08

鴻蒙HarmonyOS應用

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2021-05-20 09:50:20

鴻蒙HarmonyOS應用

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2021-05-14 10:34:29

鴻蒙HarmonyOS應用

2021-11-08 15:06:15

鴻蒙HarmonyOS應用

2021-11-05 15:00:33

鴻蒙HarmonyOS應用

2022-03-03 18:28:28

Harmony進程任務管理模塊

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-11 20:23:14

鴻蒙源碼分析進程管理
點贊
收藏

51CTO技術棧公眾號

一区不卡视频| 91免费的视频在线播放| 熟女俱乐部一区二区视频在线| 欧美a级在线观看| 国产精品色噜噜| 99久久久久国产精品免费| 欧美日韩乱国产| 欧美xxxx中国| 亚洲精品久久久久中文字幕二区| 亚洲综合在线网站| 日本一本在线免费福利| 久久久久国色av免费看影院| 91精品综合久久久久久五月天| 国产乡下妇女做爰视频| 欧美oldwomenvideos| 亚洲精品国产福利| 欧美午夜精品理论片| 偷拍自拍在线看| 亚洲免费在线观看视频| 极品尤物一区二区三区| 国产精品一区二区黑人巨大| 美女精品网站| 欧美激情一区二区久久久| 亚洲午夜精品久久久久久高潮| 亚洲日本va中文字幕| 欧美日韩精品一区二区三区蜜桃| 无码人妻精品一区二区蜜桃网站| av国产在线观看| www日韩大片| www.久久爱.cn| 国产一区二区在线播放视频| 午夜在线一区二区| 久久久视频免费观看| 久久久99999| 成人精品中文字幕| 精品中文视频在线| 亚洲久久久久久| 亚洲五码在线| 欧美一级黄色大片| 亚洲综合欧美在线| 久久xxx视频| 在线观看日韩高清av| www国产精品内射老熟女| 伊人手机在线| 亚洲靠逼com| 日韩第一页在线观看| av在线1区2区| 亚洲国产高清aⅴ视频| 麻豆传媒一区二区| 日本福利片在线| 99国产精品国产精品毛片| 91精品久久久久久蜜桃| 国产精品久久无码一三区| 久久成人免费日本黄色| 国产精品视频久久久| 波多野结衣一二区| 日本成人超碰在线观看| 国产精品美女网站| 夜夜躁很很躁日日躁麻豆| 久久99蜜桃精品| 91网在线免费观看| 国产手机av在线| 丰满亚洲少妇av| 国产欧美日韩伦理| 亚洲人成色777777老人头| av亚洲精华国产精华精华 | 一区二区三区视频| 天堂资源在线中文| 亚洲欧美日韩国产中文在线| 六月婷婷激情网| 欧美激情成人动漫| 天天综合天天综合色| 成人在线免费观看av| 亚洲精品成人图区| 欧美三级一区二区| 91视频福利网| 日韩在线观看一区二区三区| 精品国产凹凸成av人导航| 日本丰满少妇裸体自慰| 精品日韩一区| 美日韩丰满少妇在线观看| 久久丫精品久久丫| 久久久久久久欧美精品| 国产日韩精品视频| 丁香六月色婷婷| 久久影院午夜论| 伊人久久大香线蕉成人综合网| 在线观看a级片| 欧美日韩国产在线看| 国产精品99久久免费黑人人妻| 国产精品亚洲成在人线| 日韩免费性生活视频播放| 在线 丝袜 欧美 日韩 制服| 四季av一区二区三区免费观看 | 亚洲女同志freevdieo| 欧美亚洲综合色| 三大队在线观看| 国产一区二区三区91| 超碰日本道色综合久久综合| 国产精品xxxx喷水欧美| 激情综合色播激情啊| 精选一区二区三区四区五区| 日本成人在线播放| 大伊人狠狠躁夜夜躁av一区| 日本在线播放一区二区| 老司机精品在线| 久久久999精品视频| 国产精品美女久久久久av爽| 黄色资源网久久资源365| 久久综合毛片| 色av手机在线| 欧美日韩成人在线一区| 国产精品无码网站| 欧美一区成人| 国产精品一区二区三区久久| 三级视频在线| 亚洲线精品一区二区三区| 日本熟妇人妻中出| 天天躁日日躁狠狠躁欧美巨大小说| zzjj国产精品一区二区| 日本黄色中文字幕| 成人午夜视频免费看| 熟女熟妇伦久久影院毛片一区二区| 涩涩av在线| 精品久久国产字幕高潮| 神马午夜精品91| 美女性感视频久久| 欧美日韩在线播放一区二区| 国产乱码午夜在线视频| 日韩一级片网站| 国产精品成人69xxx免费视频| 国产模特精品视频久久久久| 国产精品xxxx| 乱插在线www| 日韩精品最新网址| 麻豆疯狂做受xxxx高潮视频| 激情av综合网| 男同互操gay射视频在线看| 四虎精品一区二区免费| 中文字幕亚洲综合| 瑟瑟视频在线免费观看| 国产亚洲自拍一区| 人人爽人人av| 欧美亚洲高清| 国产精品香蕉av| 亚洲成人三级| 91 com成人网| www.超碰在线观看| 国产精品一区在线| 男女裸体影院高潮| 一区二区三区在线资源| 欧美高清在线视频观看不卡| 性中国古装videossex| 一区二区在线观看免费| 绯色av蜜臀vs少妇| 狠狠干综合网| 久久99精品久久久久久三级| 日韩脚交footjobhd| 亚洲欧美另类人妖| 国产精品欧美综合| 日韩一区有码在线| 99精品视频免费版的特色功能| 在线免费观看日本欧美爱情大片| 亚洲自拍欧美色图| 99在线视频影院| 精品小视频在线| 国产成人麻豆免费观看| 中文成人av在线| 97人人模人人爽人人澡| 国内精品嫩模av私拍在线观看| 国产日韩欧美一区二区| 91精品论坛| 日韩在线免费高清视频| 国产伦精品一区二区三区四区| 亚洲精品国产一区二区三区四区在线| 日本wwwwwww| 久久久久久久高潮| av磁力番号网| 欧美理伦片在线播放| 国产精品久久久久久久久久免费| 免费大片在线观看www| 欧美tickling网站挠脚心| 国产精品免费精品一区| 亚洲欧洲精品天堂一级| 亚洲av成人片无码| 免费在线观看成人| 成人av在线播放观看| 欧美三级自拍| 91久久久精品| 欧美私密网站| 久久在精品线影院精品国产| 午夜av免费观看| 欧美日韩一级二级| 日本三级黄色大片| 中文av字幕一区| 美女又爽又黄免费| 麻豆国产欧美日韩综合精品二区| 在线观看av的网址| 欧美激情在线免费| 丁香五月网久久综合| 小黄鸭精品aⅴ导航网站入口| 麻豆乱码国产一区二区三区| 青青操在线视频| 欧美一区二区三区色| 久久国产乱子伦精品| 亚洲自拍偷拍图区| 日本视频在线免费| 91亚洲大成网污www| 日本成人xxx| 青娱乐精品在线视频| 国产精品专区在线| 一区二区电影在线观看| 日韩欧美99| 日韩伦理一区二区三区| 97在线资源站| 日韩精品第二页| 国产激情视频一区| 极品视频在线| 久久久免费精品视频| a级毛片免费观看在线| 在线成人中文字幕| 视频国产在线观看| 欧美mv日韩mv国产网站app| 最新在线中文字幕| 色播五月激情综合网| 日韩精品――中文字幕| 一区二区三区日韩欧美| 日日噜噜夜夜狠狠久久波多野| 欧美国产乱子伦| 国产探花视频在线播放| 久久久www成人免费无遮挡大片| 欧美肉大捧一进一出免费视频| 国产精品白丝jk白祙喷水网站 | 亚洲精品视频在线观看免费视频| 亚洲人成影院在线观看| 最新日韩免费视频| 欧美国产在线观看| 中文字幕第24页| 国产精品色呦呦| 三区四区在线观看| 国产精品三级久久久久三级| 老司机精品免费视频| 中文字幕不卡在线| 少妇高潮惨叫久久久久| 国产欧美视频在线观看| 永久免费毛片在线观看| 中文字幕免费不卡| 国产aaaaaaaaa| 国产精品久久一级| 亚洲区一区二区三| 操一操视频一区| 九色porny丨国产首页在线| 久久久在线视频| h片在线观看视频免费| 韩国三级日本三级少妇99| 国产经典三级在线| 久久久久久噜噜噜久久久精品| 欧美巨大xxxx做受沙滩| 午夜免费久久久久| 东京一区二区| 国产精品毛片a∨一区二区三区|国| 美女网站视频一区| 国产精品入口尤物| 精品一区91| 国产精品一区二区三区在线观| 久久99国产精品久久99大师 | 亚洲精华一区二区三区| 秋霞在线观看一区二区三区| 欧美视频网址| 欧美三级午夜理伦三级老人| 亚洲国产精品一区制服丝袜| 丰满少妇被猛烈进入高清播放| 丝瓜av网站精品一区二区| 五月天激情播播| 成人午夜在线免费| 成年人免费观看视频网站| 日本一区二区高清| 欧美成欧美va| 欧美性高潮床叫视频| 亚洲天堂999| 欧美精品一区二区精品网| 日韩av成人| 久久久成人的性感天堂| xxxx另类黑人| 国产免费亚洲高清| aaa国产精品| 日韩精品久久一区二区三区| 亚欧美无遮挡hd高清在线视频| www.好吊操| 另类中文字幕网| 亚洲一区二区三区黄色| 国产欧美日韩另类视频免费观看 | 欧美一区二区三区久久精品| 国产av人人夜夜澡人人爽麻豆| 日韩电影在线一区| av av在线| 欧美极品少妇xxxxⅹ高跟鞋| 麻豆一区二区三区精品视频| 在线一区二区三区四区五区 | 国产成人免费在线观看| 三级网站在线免费观看| 一区二区三区精品在线观看| 中文字幕日韩免费| 精品国产一区二区亚洲人成毛片| 精品欧美不卡一区二区在线观看| 久久97精品久久久久久久不卡| se01亚洲视频| 国产在线精品一区| 一区二区电影| 亚洲国产高清av| www国产精品av| 加勒比av在线播放| 欧美日韩一级二级三级| 你懂得在线网址| 国内精品国产三级国产在线专| 亚洲综合视频| 四虎一区二区| 欧美亚洲自偷自偷| 在线xxxxx| 亚洲一区二区三区三| 一卡二卡三卡在线观看| 亚洲人成在线观看| 92久久精品| www日韩av| 五月天综合网站| 艹b视频在线观看| 国产日韩在线不卡| 中文字幕超碰在线| 日韩av有码在线| 1024在线看片你懂得| 99在线热播| 欧美精品三区| 国产一级二级av| 亚洲精品视频在线| 国产老妇伦国产熟女老妇视频| 中文字幕精品一区久久久久| 日韩pacopacomama| 欧美二区在线| 久久精品官网| 免费看黄色的视频| 日本韩国欧美在线| 国产系列在线观看| 国产精品国产亚洲伊人久久| 国产一区二区三区日韩精品| 免费黄色日本网站| 久久久久久99久久久精品网站| 精品不卡一区二区| 亚洲视频精品在线| 78精品国产综合久久香蕉| 天天综合色天天综合色hd| 奇米影视在线99精品| 永久av免费网站| 日韩午夜电影在线观看| 五月花成人网| 国内精品国语自产拍在线观看| 亚洲黄色视屏| 爱爱的免费视频| 在线观看一区不卡| 精品视频在线一区二区| 51国偷自产一区二区三区| 欧美精选在线| 第四色在线视频| 色综合久久88色综合天天| 97最新国自产拍视频在线完整在线看| 国产精品久久久久久av福利| 91视频久久| 农村末发育av片一区二区| 亚洲一区二区综合| 亚洲AV第二区国产精品| 国产精品久久国产精品99gif| 日韩一区二区中文| 香蕉视频在线观看黄| 天天亚洲美女在线视频| 精品美女视频在线观看免费软件 | 精品人妻少妇AV无码专区| 久久久久久中文| 中文字幕精品影院| 日韩av自拍偷拍| 亚洲成人综合网站| 福利在线午夜| 91一区二区三区| 视频一区二区中文字幕| 日韩激情综合网| 亚洲高清在线观看| 丁香婷婷久久| 久久综合久久网| 中文字幕乱码久久午夜不卡 | 91美女片黄在线| 一炮成瘾1v1高h| 777777777亚洲妇女| 成人3d精品动漫精品一二三| 免费观看一区二区三区| 91搞黄在线观看| 欧美人与动牲性行为| 日韩福利影院| 成人天堂资源www在线| 中国a一片一级一片| 97久久精品人人澡人人爽缅北| 日本黄色精品| 在线视频 日韩|