精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲在线观看网站| 一区二区三区四区| 凹凸精品一区二区三区| 成人黄色小视频| 日韩一区二区在线免费观看| 亚洲精品蜜桃久久久久久| 免费一级在线观看播放网址| 麻豆高清免费国产一区| 久久久久国产视频| 午夜影院黄色片| 高清精品视频| 欧美日韩国产综合视频在线观看| 黄色成人在线看| 午夜在线小视频| www.成人在线| 91在线视频九色| 国产中文字幕视频| 欧美体内she精视频在线观看| 日韩久久免费视频| 免费欧美一级片| 先锋欧美三级| 五月婷婷综合网| 日本xxxxx18| yiren22综合网成人| 99久久久久免费精品国产| 成人精品久久久| 久久精品偷拍视频| 国产一区白浆| 国产做受69高潮| 丁香花五月激情| 日韩欧美高清在线播放| 精品一区二区电影| 久久久久久久久久久影视| 嫩草伊人久久精品少妇av杨幂| 亚洲中国最大av网站| 一级一片免费播放| a中文在线播放| 久久综合色播五月| 国产精品传媒毛片三区| japanese国产| 国产在线播放一区二区三区| 国产精品美女久久久久久免费| 青青草av在线播放| 亚洲欧洲一级| 992tv成人免费视频| 国产亚洲精品久久777777| 在线精品小视频| 久久综合亚洲社区| 久草手机视频在线观看| 久久理论电影| 日韩在线观看免费| 99热99这里只有精品| 日韩久久精品| 伊人久久久久久久久久久| 我和岳m愉情xxxⅹ视频| 一呦二呦三呦国产精品| 亚洲精品网站在线播放gif| 日韩少妇一区二区| 日本精品影院| 亚洲精品天天看| 非洲一级黄色片| 精品国产一区二区三区噜噜噜 | 午夜精品久久久久久久爽 | 国产区二精品视| 亚洲第一视频在线| 成人国产电影网| 精品福利影视| 免费在线超碰| 国产精品嫩草影院com| 在线看成人av电影| 日本无删减在线| 精品成人在线视频| 国产男女激情视频| 青青伊人久久| 日韩一级完整毛片| 国产精品无码电影| 国产成人精品999在线观看| 国产一区二区三区精品久久久| 一本在线免费视频| 这里只有精品在线| 久久久久亚洲精品| 国产午夜精品久久久久| 麻豆成人免费电影| 成人av播放| 黄色在线免费观看大全| 日韩理论片一区二区| 日本香蕉视频在线观看| 日韩欧美精品电影| 日韩一卡二卡三卡四卡| 熟女俱乐部一区二区视频在线| 美女久久久久| 久久最新资源网| 99热只有这里有精品| 久久国产综合精品| 国产精品一区二区欧美| 国产最新视频在线| 亚洲精品中文在线影院| 丰满人妻中伦妇伦精品app| 激情中国色综合| 欧美xfplay| 国产一区二区三区四区在线| 国产精品www.| 国产精品一区二区三区久久久 | 亚洲成a人片777777久久| 精品久久一二三区| 国产三级短视频| 亚洲国产精品一区制服丝袜| 国产女精品视频网站免费| 日本黄视频在线观看| 日韩美女精品在线| 成人三级视频在线播放| 91成人入口| 日韩在线中文视频| 日韩精品一区二区亚洲av| 国产福利一区在线观看| 日本一区二区三区精品视频| 国产区美女在线| 欧美妇女性影城| 国产精品成人无码免费| 亚洲欧美日韩国产一区| 成人免费在线看片| 美女免费久久| 欧美综合一区二区| 日本黄色网址大全| 亚洲性人人天天夜夜摸| 91在线观看免费网站| 天堂中文а√在线| 欧美网站大全在线观看| 中文幕无线码中文字蜜桃| 在线日韩欧美| 成人免费在线看片| 亚洲男同gay网站| 欧美丰满高潮xxxx喷水动漫| 国产综合精品在线| 亚久久调教视频| 精品视频在线观看| free性m.freesex欧美| 精品国产三级a在线观看| 久久久久亚洲av片无码| 精品一区二区三区在线视频| 亚洲成人自拍视频| 日韩欧美另类一区二区| 亚洲女人初尝黑人巨大| 亚洲图片在线视频| 久久久影视传媒| 97在线免费公开视频| 天海翼精品一区二区三区| 91极品视频在线| 污视频在线免费观看| 天天亚洲美女在线视频| 亚洲一区二区三区四区五区六区| 亚洲国产婷婷| 久久久久九九九| 欧美成人ⅴideosxxxxx| 亚洲色图日韩av| 国产真人无遮挡作爱免费视频| 久久精品一区二区| 天堂在线资源视频| 欧美韩日高清| 98国产高清一区| 福利写真视频网站在线| 日韩电影网在线| 黄色在线视频网址| 国产精品你懂的在线欣赏| 天天av天天操| 1024日韩| 色综合电影网| 国产精品xnxxcom| 欧美肥臀大乳一区二区免费视频| 欧美熟妇乱码在线一区| 欧美视频裸体精品| 一级片久久久久| 国产九色精品成人porny| 欧美国产视频一区| 天堂成人娱乐在线视频免费播放网站 | 高清在线视频不卡| 亚洲无av在线中文字幕| 97caocao| 亚洲国产综合在线| 亚洲欧洲久久久| 精品一区二区三区久久| av网站手机在线观看| 美女久久久久| 亚洲精品欧美日韩专区| 无遮挡爽大片在线观看视频 | 成人黄色免费网址| 国产精品99久久久久久宅男| 可以在线看的av网站| 欧美手机视频| 国产91精品入口17c| 欧美www.| 欧美激情极品视频| 69av亚洲| 亚洲精品久久久久中文字幕二区| 艳妇乳肉豪妇荡乳av无码福利| 亚洲综合999| 国产美女永久免费无遮挡| 国产成人99久久亚洲综合精品| 欧美老熟妇喷水| 亚洲国产精品久久久久蝴蝶传媒| 精品在线观看一区二区| 曰本一区二区| 日韩免费观看av| xxx在线免费观看| 久久久999成人| 精品亚洲成a人片在线观看| 日韩一级免费一区| 成人免费一级片| 黄色成人在线免费| 国产97免费视频| 国产欧美精品一区二区色综合朱莉| 国产综合内射日韩久| 九九**精品视频免费播放| 国产成人在线免费看| 午夜欧美精品| 亚洲一二区在线| 国产99精品一区| 国产偷国产偷亚洲高清97cao| 亚洲国产91视频| 国产成人小视频在线观看| 成av人片在线观看www| 裸体女人亚洲精品一区| 第一福利在线| 亚洲男人天堂2019| 欧洲精品久久一区二区| 日韩一区二区免费在线观看| 91久久精品无码一区二区| 日韩欧美中文在线| 日韩污视频在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 在线看片中文字幕| 久久精品视频网| 成年人在线观看av| www.日韩精品| 国产精品久久久久久久无码| 高清久久久久久| 日本中文字幕有码| 国产激情精品久久久第一区二区| 亚洲精品第三页| 激情综合网激情| 亚洲免费999| 精品亚洲免费视频| 尤物国产在线观看| 九色综合狠狠综合久久| 亚洲一区二区在线视频观看| 久久99国产精品久久99| 色91精品久久久久久久久| 激情都市一区二区| 天天色天天综合网| 国产在线日韩欧美| 熟妇女人妻丰满少妇中文字幕| 国产成人啪免费观看软件| 欧美日韩一区二区区| 丰满亚洲少妇av| 在线免费观看污视频| 2023国产精品自拍| a天堂中文字幕| 日本一区二区视频在线| av免费播放网站| 自拍偷拍欧美激情| 久久综合加勒比| 精品久久久国产| 麻豆成人免费视频| 欧美日韩一区二区三区在线看| 91久久久久久久久久久久| 欧美一区二区精品久久911| 国产夫妻自拍av| 亚洲激情第一页| 玖玖综合伊人| 久久深夜福利免费观看| 福利小视频在线| 国产精品国语对白| 亚洲老司机网| 国产一区二区精品在线| 中国av一区| 日本一级淫片演员| 亚洲国产清纯| 日韩大片一区二区| 国产成人亚洲综合a∨婷婷图片| 在线黄色免费网站| 中文字幕精品一区二区精品绿巨人| 久草综合在线视频| 欧美色播在线播放| 国产免费福利视频| 日韩精品中文字幕有码专区 | 45www国产精品网站| 成人亚洲免费| 国产精品久久久久久久免费大片 | 国产一区二区三区在线视频| 在线三级中文| 日韩免费观看网站| 日韩一区网站| 欧美一区二区福利| 午夜国产精品视频| 日韩中文字幕组| 国产成人亚洲综合a∨婷婷| 日本二区在线观看| 亚洲一卡二卡三卡四卡无卡久久 | 六月丁香婷婷久久| 手机在线成人av| 国产精品久久久久久久久晋中 | 日日摸夜夜添夜夜添精品视频| 亚洲欧美日韩一二三区| 久久免费国产精品| 久久艹精品视频| 欧美日本视频在线| 牛牛热在线视频| 国内精品一区二区三区| 欧美大陆国产| 久久99精品久久久久久久久久| 亚洲精品888| 精品日韩久久久| 91网站在线播放| 精品无码一区二区三区电影桃花| 欧美日韩精品一区二区在线播放| 天天综合网天天综合| 欧美黑人性猛交| 91精品国产色综合久久不卡粉嫩| 欧美日韩免费观看一区| 极品日韩av| 野花视频免费在线观看| 亚洲视频综合在线| 欧美 亚洲 另类 激情 另类| 亚洲美女中文字幕| 国产乱码精品一区二三赶尸艳谈| 91黄色国产视频| 亚洲综合小说| 最新国产黄色网址| 国产精品水嫩水嫩| japanese国产在线观看| 亚洲欧美日韩区| 亚洲天堂av影院| 久久大香伊蕉在人线观看热2| 黄色亚洲大片免费在线观看| 丰满少妇中文字幕| 亚洲免费av网站| 国产日韩欧美一区二区东京热| 在线色欧美三级视频| 欧美xxxx做受欧美护士| 日本一区二区三区免费看 | 亚洲天堂av一区二区三区| 国产精品免费av| 91免费视频播放| 久久久精品亚洲| 麻豆精品久久| 日本阿v视频在线观看| 粉嫩av一区二区三区| 国产在线视频99| 亚洲国产97在线精品一区| 色偷偷偷在线视频播放| 免费看污久久久| 日韩激情一二三区| 中国特黄一级片| 9191国产精品| 狂野欧美激情性xxxx欧美| 岛国视频一区免费观看| 亚洲美女毛片| av网在线播放| 3751色影院一区二区三区| caopen在线视频| 国产精成人品localhost| 一本色道久久| 国产jk精品白丝av在线观看 | 日本特黄a级片| 亚洲私人黄色宅男| 国产小视频一区| 欧美自拍视频在线| av亚洲免费| 三大队在线观看| 色综合色狠狠天天综合色| 99青草视频在线播放视| 亚洲xxxx在线| 亚洲专区一区| av资源在线免费观看| 日韩一级二级三级| 在线成人av观看| 亚洲一区二区三区四区中文| 国产一区二区不卡在线| 国产成人无码精品久久久久| 亚洲网站视频福利| 视频精品国内| av免费网站观看| 亚洲精品自拍动漫在线| 理论视频在线| 91成人伦理在线电影| 麻豆成人精品| 国产探花在线免费观看| 亚洲久久久久久久久久| 国产一区二区视频在线看| 每日在线更新av| 亚洲欧洲无码一区二区三区| 少妇精品高潮欲妇又嫩中文字幕 | 三上悠亚在线一区| 亚洲午夜久久久久久久久电影网| 国产精品二线| 国产精品一区二区欧美| 激情综合亚洲精品| 国产成人一级片| 欧美国产日本高清在线 | 日本wwwcom|