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

鴻蒙輕內核M核源碼分析系列十一 信號量Semaphore

開發(fā) 前端
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內容請前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術社區(qū)https://harmonyos.51cto.com

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

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

https://harmonyos.51cto.com

 信號量(Semaphore)是一種實現(xiàn)任務間通信的機制,可以實現(xiàn)任務間同步或共享資源的互斥訪問。一個信號量的數(shù)據(jù)結構中,通常有一個計數(shù)值,用于對有效資源數(shù)的計數(shù),表示剩下的可被使用的共享資源數(shù)。以同步為目的的信號量和以互斥為目的的信號量在使用上存在差異。本文通過分析鴻蒙輕內核信號量模塊的源碼,掌握信號量使用上的差異。

接下來,我們看下信號量的結構體,信號量初始化,信號量常用操作的源代碼。

1、信號量結構體定義和常用宏定義

1.1 信號量結構體定義

在文件kernel\include\los_sem.h定義的信號量控制塊結構體為LosSemCB,結構體源代碼如下。信號量狀態(tài).semStat取值OS_SEM_UNUSED、OS_SEM_USED,其他成員變量的注釋見注釋部分。

  1. typedef struct { 
  2.     UINT16 semStat;      /**< 信號量狀態(tài) */ 
  3.     UINT16 semCount;     /**< 可用的信號量數(shù)量 */ 
  4.     UINT16 maxSemCount;  /**< 可用的信號量最大數(shù)量 */ 
  5.     UINT16 semID;        /**< 信號量Id */ 
  6.     LOS_DL_LIST semList; /**< 阻塞在該信號量的任務鏈表 */ 
  7. } LosSemCB; 

 1.2 信號量常用宏定義

系統(tǒng)支持創(chuàng)建多少信號量是根據(jù)開發(fā)板情況使用宏LOSCFG_BASE_IPC_SEM_LIMIT定義的,每一個信號量semId是UINT32類型的,取值為[0,LOSCFG_BASE_IPC_SEM_LIMIT),表示信號量池中各個的信號量的編號。

⑴處的宏表示二值信號量的最大值為1,⑵處、⑶處的宏表示信號量未使用、使用狀態(tài)值。⑷處根據(jù)信號量阻塞任務雙向鏈表中的鏈表節(jié)點指針ptr獲取信號量控制塊結構體指針。⑸處從信號量池中獲取指定信號量semId對應的信號量控制塊。

  1. ⑴    #define OS_SEM_BINARY_MAX_COUNT     1 
  2.  
  3. ⑵    #define OS_SEM_UNUSED               0 
  4.  
  5. ⑶    #define OS_SEM_USED                 1 
  6.  
  7. ⑷    #define GET_SEM_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosSemCB, semList) 
  8.  
  9. ⑸    #define GET_SEM(semid) (((LosSemCB *)g_allSem) + (semid)) 

 2、信號量初始化

信號量在內核中默認開啟,用戶可以通過宏LOSCFG_BASE_IPC_SEM進行關閉。開啟信號量的情況下,在系統(tǒng)啟動時,在kernel\src\los_init.c中調用OsSemInit()進行信號量模塊初始化。

下面,我們分析下信號量初始化的代碼。

⑴初始化雙向循環(huán)鏈表g_unusedSemList,維護未使用的信號量池。⑵為信號量池申請內存,如果申請失敗,則返回錯誤。⑶循環(huán)每一個信號量進行初始化,為每一個信號量節(jié)點指定索引semID,把.semStat設置為未使用OS_SEM_UNUSED,并執(zhí)行⑷把信號量節(jié)點插入未使用信號量雙向鏈表g_unusedSemList。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsSemInit(VOID) 
  2.     LosSemCB *semNode = NULL
  3.     UINT16 index
  4.  
  5. ⑴  LOS_ListInit(&g_unusedSemList); 
  6.  
  7.     if (LOSCFG_BASE_IPC_SEM_LIMIT == 0) { 
  8.         return LOS_ERRNO_SEM_MAXNUM_ZERO; 
  9.     } 
  10.  
  11. ⑵  g_allSem = (LosSemCB *)LOS_MemAlloc(m_aucSysMem0, (LOSCFG_BASE_IPC_SEM_LIMIT * sizeof(LosSemCB))); 
  12.     if (g_allSem == NULL) { 
  13.         return LOS_ERRNO_SEM_NO_MEMORY; 
  14.     } 
  15.  
  16. ⑶  for (index = 0; index < LOSCFG_BASE_IPC_SEM_LIMIT; index++) { 
  17.         semNode = ((LosSemCB *)g_allSem) + index
  18.         semNode->semID = index
  19.         semNode->semStat = OS_SEM_UNUSED; 
  20. ⑷      LOS_ListTailInsert(&g_unusedSemList, &semNode->semList); 
  21.     } 
  22.     return LOS_OK; 

 3、信號量常用操作

3.1 信號量創(chuàng)建

我們可以使用函數(shù)LOS_SemCreate(UINT16 count, UINT32 *semHandle)來創(chuàng)建計數(shù)信號量,使用UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle)創(chuàng)建二值信號量,下面通過分析源碼看看如何創(chuàng)建信號量的。

2個函數(shù)的傳入?yún)?shù)一樣,需要傳入信號量的數(shù)量count,和保存信號量編號的semHandle。計數(shù)信號量的最大數(shù)量為OS_SEM_COUNTING_MAX_COUNT,二值信號量的最大數(shù)量為OS_SEM_BINARY_MAX_COUNT。會進一步調用函數(shù)OsSemCreate()實現(xiàn)信號量的創(chuàng)建,下文繼續(xù)分析。

  1. LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemCreate(UINT16 count, UINT32 *semHandle) 
  2.     return OsSemCreate(count, OS_SEM_COUNTING_MAX_COUNT, semHandle); 
  3.  
  4. LITE_OS_SEC_TEXT_INIT UINT32 LOS_BinarySemCreate(UINT16 count, UINT32 *semHandle) 
  5.     return OsSemCreate(count, OS_SEM_BINARY_MAX_COUNT, semHandle); 

 我們看看創(chuàng)建信號量的函數(shù)OsSemCreate(),需要3個參數(shù),創(chuàng)建的信號量的數(shù)量,最大數(shù)量,以及信號量編號。

⑴判斷g_unusedSemList是否為空,還有可以使用的信號量資源?如果沒有可以使用的信號量,調用函數(shù)OsSemInfoGetFullDataHook()做些調測相關的檢測,這個函數(shù)需要開啟調測開關,后續(xù)系列專門分析。

⑵處如果g_unusedSemList不為空,則獲取第一個可用的信號量節(jié)點,接著從雙向鏈表g_unusedSemList中刪除,然后調用宏GET_SEM_LIST獲取LosSemCB *semCreated

,初始化創(chuàng)建的信號量信息,包含信號量的狀態(tài)、信號量數(shù)量,信號量最大數(shù)量等信息。⑶初始化雙向鏈表&semCreated->semList,阻塞在這個信號量上的任務會掛在這個鏈表上。⑷賦值給輸出參數(shù)*semHandle,后續(xù)程序使用這個信號量編號對信號量進行其他操作。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsSemCreate(UINT16 count, UINT16 maxCount, UINT32 *semHandle) 
  2.     UINT32 intSave; 
  3.     LosSemCB *semCreated = NULL
  4.     LOS_DL_LIST *unusedSem = NULL
  5.     UINT32 errNo; 
  6.     UINT32 errLine; 
  7.  
  8.     if (semHandle == NULL) { 
  9.         return LOS_ERRNO_SEM_PTR_NULL; 
  10.     } 
  11.  
  12.     if (count > maxCount) { 
  13.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_SEM_OVERFLOW); 
  14.     } 
  15.  
  16.     intSave = LOS_IntLock(); 
  17.  
  18. ⑴  if (LOS_ListEmpty(&g_unusedSemList)) { 
  19.         LOS_IntRestore(intSave); 
  20.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_SEM_ALL_BUSY); 
  21.     } 
  22.  
  23. ⑵  unusedSem = LOS_DL_LIST_FIRST(&(g_unusedSemList)); 
  24.     LOS_ListDelete(unusedSem); 
  25.     semCreated = (GET_SEM_LIST(unusedSem)); 
  26.     semCreated->semCount = count
  27.     semCreated->semStat = OS_SEM_USED; 
  28.     semCreated->maxSemCount = maxCount; 
  29. ⑶  LOS_ListInit(&semCreated->semList); 
  30. ⑷  *semHandle = (UINT32)semCreated->semID; 
  31.     LOS_IntRestore(intSave); 
  32.     OsHookCall(LOS_HOOK_TYPE_SEM_CREATE, semCreated); 
  33.     return LOS_OK; 
  34.  
  35. ERR_HANDLER: 
  36.     OS_RETURN_ERROR_P2(errLine, errNo); 

 3.2 信號量刪除

我們可以使用函數(shù)LOS_semDelete(UINT32 semHandle)來刪除信號量,下面通過分析源碼看看如何刪除信號量的。

⑴處判斷信號量semHandle是否超過LOSCFG_BASE_IPC_SEM_LIMIT,如果超過則返回錯誤碼。如果信號量編號沒有問題,獲取信號量控制塊LosSemCB *semDeleted。⑵處判斷要刪除的信號量的狀態(tài),如果處于未使用狀態(tài),則跳轉到錯誤標簽ERR_HANDLER:進行處理。⑶如果信號量的阻塞任務列表不為空,不允許刪除,跳轉到錯誤標簽進行處理。⑷處如果信號量可用刪除,則會把.semStat設置為未使用OS_SEM_UNUSED,并把信號量節(jié)點插入未使用信號量雙向鏈表g_unusedSemList。

  1. LITE_OS_SEC_TEXT_INIT UINT32 LOS_SemDelete(UINT32 semHandle) 
  2.     UINT32 intSave; 
  3.     LosSemCB *semDeleted = NULL
  4.     UINT32 errNo; 
  5.     UINT32 errLine; 
  6.  
  7. ⑴  if (semHandle >= (UINT32)LOSCFG_BASE_IPC_SEM_LIMIT) { 
  8.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_SEM_INVALID); 
  9.     } 
  10.  
  11.     semDeleted = GET_SEM(semHandle); 
  12.     intSave = LOS_IntLock(); 
  13. ⑵  if (semDeleted->semStat == OS_SEM_UNUSED) { 
  14.         LOS_IntRestore(intSave); 
  15.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_SEM_INVALID); 
  16.     } 
  17.  
  18. ⑶  if (!LOS_ListEmpty(&semDeleted->semList)) { 
  19.         LOS_IntRestore(intSave); 
  20.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_SEM_PENDED); 
  21.     } 
  22.  
  23. ⑷  LOS_ListAdd(&g_unusedSemList, &semDeleted->semList); 
  24.     semDeleted->semStat = OS_SEM_UNUSED; 
  25.     LOS_IntRestore(intSave); 
  26.     OsHookCall(LOS_HOOK_TYPE_SEM_DELETE, semDeleted); 
  27.     return LOS_OK; 
  28. ERR_HANDLER: 
  29.     OS_RETURN_ERROR_P2(errLine, errNo); 

 3.3 信號量申請

我們可以使用函數(shù)UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)來請求信號量,需要的2個參數(shù)分別是信號量semHandle和等待時間timeout,取值范圍為[0, LOS_WAIT_FOREVER],單位為Tick。下面通過分析源碼看看如何請求信號量的。

申請信號量時首先會進行信號量編號、參數(shù)的合法性校驗。⑴處代碼表示信號量如果大于配置的最大值,則返回錯誤碼。⑵處獲取要申請的信號量控制塊semPended。⑶處調用函數(shù)對信號量控制塊進行校驗,如果信號量未創(chuàng)建,處于中斷處理期間,處于鎖任務調度期間,則返回錯誤碼。⑷處如果校驗不通過,跳轉到ERROR_SEM_PEND:標簽停止信號量的申請。

⑸如果信號量計數(shù)大于0,信號量計數(shù)減1,返回申請成功的結果。⑹如果信號量計數(shù)等于0,并且零等待時間timeout,則返回結果碼LOS_ERRNO_SEM_UNAVAILABLE。⑺如果申請的信號量被全部占用,需要等待時,把當前任務阻塞的信號量.taskSem標記為申請的信號量,然后調用函數(shù)OsSchedTaskWait(),該函數(shù)詳細代碼上文已分析,把當前任務狀態(tài)設置為阻塞狀態(tài),加入信號量的阻塞鏈表.semList。如果不是永久等待LOS_WAIT_FOREVER,還需要更改任務狀態(tài)為OS_TASK_STATUS_PEND_TIME,并且設置waitTimes等待時間。⑻處觸發(fā)任務調度進行任務切換,暫時不執(zhí)行后續(xù)代碼。

如果等待時間超時,信號量還不可用,本任務獲取不到信號量時,繼續(xù)執(zhí)行⑼,更改任務狀態(tài),返回錯誤碼。如果信號量可用,執(zhí)行⑽,本任務獲取到信號量,返回申請成功。

  1. LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout) 
  2.     UINT32 intSave; 
  3.     LosSemCB *semPended = NULL
  4.     UINT32 retErr; 
  5.     LosTaskCB *runningTask = NULL
  6.  
  7. ⑴  if (semHandle >= (UINT32)LOSCFG_BASE_IPC_SEM_LIMIT) { 
  8.         OS_RETURN_ERROR(LOS_ERRNO_SEM_INVALID); 
  9.     } 
  10.  
  11. ⑵  semPended = GET_SEM(semHandle); 
  12.     intSave = LOS_IntLock(); 
  13.  
  14. ⑶  retErr = OsSemValidCheck(semPended); 
  15.     if (retErr) { 
  16. ⑷      goto ERROR_SEM_PEND; 
  17.     } 
  18.  
  19. ⑸  if (semPended->semCount > 0) { 
  20.         semPended->semCount--; 
  21.         LOS_IntRestore(intSave); 
  22.         OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask); 
  23.         return LOS_OK; 
  24.     } 
  25.  
  26. ⑹  if (!timeout) { 
  27.         retErr = LOS_ERRNO_SEM_UNAVAILABLE; 
  28.         goto ERROR_SEM_PEND; 
  29.     } 
  30.  
  31. ⑺  runningTask = (LosTaskCB *)g_losTask.runTask; 
  32.     runningTask->taskSem = (VOID *)semPended; 
  33.     OsSchedTaskWait(&semPended->semList, timeout); 
  34.     LOS_IntRestore(intSave); 
  35.     OsHookCall(LOS_HOOK_TYPE_SEM_PEND, semPended, runningTask); 
  36. ⑻  LOS_Schedule(); 
  37.  
  38.     intSave = LOS_IntLock(); 
  39. ⑼  if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { 
  40.         runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT); 
  41.         retErr = LOS_ERRNO_SEM_TIMEOUT; 
  42.         goto ERROR_SEM_PEND; 
  43.     } 
  44.  
  45.     LOS_IntRestore(intSave); 
  46. ⑽  return LOS_OK; 
  47.  
  48. ERROR_SEM_PEND: 
  49.     LOS_IntRestore(intSave); 
  50.     OS_RETURN_ERROR(retErr); 

 3.4 信號量釋放

我們可以使用函數(shù)UINT32 LOS_semPost(UINT32 semHandle)來釋放信號量,下面通過分析源碼看看如何釋放信號量的。

釋放信號量時首先會進行信號量編號、參數(shù)的合法性校驗,這些比較簡單,自行閱讀即可。⑴處驗判斷是否信號量溢出。⑵如果信號量的任務阻塞鏈表不為空,執(zhí)行⑶從阻塞鏈表中獲取第一個任務,設置.taskSem為NULL,不再阻塞信號量。執(zhí)行⑷把獲取到信號量的任務調整其狀態(tài),并加入就行隊列。⑸觸發(fā)任務調度進行任務切換。⑹如果信號量的任務阻塞鏈表為空,則把信號量的計數(shù)加1。

  1. LITE_OS_SEC_TEXT UINT32 LOS_SemPost(UINT32 semHandle) 
  2.     UINT32 intSave; 
  3.     LosSemCB *semPosted = GET_SEM(semHandle); 
  4.     LosTaskCB *resumedTask = NULL
  5.  
  6.     if (semHandle >= LOSCFG_BASE_IPC_SEM_LIMIT) { 
  7.         return LOS_ERRNO_SEM_INVALID; 
  8.     } 
  9.  
  10.     intSave = LOS_IntLock(); 
  11.  
  12.     if (semPosted->semStat == OS_SEM_UNUSED) { 
  13.         LOS_IntRestore(intSave); 
  14.         OS_RETURN_ERROR(LOS_ERRNO_SEM_INVALID); 
  15.     } 
  16.  
  17. ⑴  if (semPosted->maxSemCount == semPosted->semCount) { 
  18.         LOS_IntRestore(intSave); 
  19.         OS_RETURN_ERROR(LOS_ERRNO_SEM_OVERFLOW); 
  20.     } 
  21. ⑵  if (!LOS_ListEmpty(&semPosted->semList)) { 
  22. ⑶      resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(semPosted->semList))); 
  23.         resumedTask->taskSem = NULL
  24. ⑷      OsSchedTaskWake(resumedTask); 
  25.  
  26.         LOS_IntRestore(intSave); 
  27.         OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask); 
  28. ⑸      LOS_Schedule(); 
  29.     } else { 
  30. ⑹      semPosted->semCount++; 
  31.         LOS_IntRestore(intSave); 
  32.         OsHookCall(LOS_HOOK_TYPE_SEM_POST, semPosted, resumedTask); 
  33.     } 
  34.  
  35.     return LOS_OK; 

 4、信號量使用總結

4.1 計數(shù)信號量、二值信號量和互斥鎖

計數(shù)信號量和二值信號量唯一的區(qū)別就是信號量的初始數(shù)量不一致,二值信號量初始數(shù)量只能為0和1,計數(shù)信號量的初始值可以為0和大于1的整數(shù)。

互斥鎖可以理解為一種特性的二值信號量,在實現(xiàn)實現(xiàn)對臨界資源的獨占式處理、互斥場景時,沒有本質的區(qū)別。比對下二值的結構體,互斥鎖的成員變量.muxCount表示加鎖的次數(shù),信號量的成員變量.semCount表示信號量的計數(shù),含義稍有不同。

4.2 信號量的互斥和同步

信號量可用用于互斥和同步兩種場景,以同步為目的的信號量和以互斥為目的的信號量在使用上,有如下不同:

  • 用于互斥的信號量

初始信號量計數(shù)值不為0,表示可用的共享資源個數(shù)。在需要使用共享資源前,先獲取信號量,然后使用一個共享資源,使用完畢后釋放信號量。這樣在共享資源被取完,即信號量計數(shù)減至0時,其他需要獲取信號量的任務將被阻塞,從而保證了共享資源的互斥訪問。對信號量的申請和釋放,需要成對出現(xiàn),在同一個任務里完成申請和釋放。

  • 用于同步的信號量

多任務同時訪問同一份共享資源時,會導致沖突,這時候就需要引入任務同步機制使得各個任務按業(yè)務需求一個一個的對共享資源進行有序訪問操作。任務同步的實質就是任務按需進行排隊。

用于同步的信號量,初始信號量計數(shù)值為0。任務1申請信號量而阻塞,直到任務2或者某中斷釋放信號量,任務1才得以進入Ready或Running態(tài),從而達到了任務間的同步。信號量的能不能申請成功,依賴其他任務是否釋放信號量,申請和釋放在不同的任務里完成。

小結

本文帶領大家一起剖析了鴻蒙輕內核的信號量模塊的源代碼,包含信號量的結構體、信號量池初始化、信號量創(chuàng)建刪除、申請釋放等。感謝閱讀!

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

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

https://harmonyos.51cto.com

 

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

2022-04-13 11:12:43

鴻蒙輕內核信號量模塊操作系統(tǒng)

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-04-13 09:20:15

鴻蒙HarmonyOS應用開發(fā)

2021-09-07 07:53:42

Semaphore 信號量源碼

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2022-03-03 18:28:28

Harmony進程任務管理模塊

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2021-07-06 09:45:03

鴻蒙HarmonyOS應用

2021-09-22 14:36:32

鴻蒙HarmonyOS應用

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2021-05-21 09:25:11

鴻蒙HarmonyOS應用

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

狠狠操狠狠色综合网| 久久精品首页| 欧美成人aa大片| 男人插女人视频在线观看| 亚洲国产精彩视频| 免费亚洲婷婷| 久久亚洲精品网站| 特级西西人体wwwww| 中文字幕在线免费观看视频| 国产精品不卡一区二区三区| www.久久久| 午夜久久久久久久久久影院| 欧美黄色大片网站| 亚洲美女激情视频| 免费高清视频在线观看| 三级成人黄色影院| 亚洲aⅴ乱码精品成人区| 热久久一区二区| 久久精品视频一区二区| 蜜桃视频在线一区| 欧美国产日产韩国视频| 韩国女同性做爰三级| 亚洲成人黄色| 欧美裸体bbwbbwbbw| 99蜜桃臀久久久欧美精品网站| 国产剧情在线| 国产亚洲美州欧州综合国| 岛国视频一区免费观看| 中文字幕激情视频| 亚洲激情专区| 免费91在线视频| 很污很黄的网站| 国产成人久久| 亚洲欧美成人网| 极品白嫩少妇无套内谢| 91麻豆精品一二三区在线| 欧美性猛交xxxx免费看久久久| 99久久久精品视频| 3d玉蒲团在线观看| 亚洲女性喷水在线观看一区| 欧美日韩亚洲在线| 午夜视频在线免费播放| 成人爱爱电影网址| 99re国产视频| 国产福利小视频| 国产一区二区精品久久99| 国产精品视频区| 日本三级一区二区三区| 可以看av的网站久久看| 2019中文字幕全在线观看| 久久久久黄色片| 国产精品88久久久久久| 在线观看不卡av| 成人小视频免费看| 欧美精品一区二区三区中文字幕| 国产网站欧美日韩免费精品在线观看 | 男人天堂手机在线观看| 国产91高潮流白浆在线麻豆| 99视频网站| 黄色小视频免费在线观看| 国产成人福利片| av日韩免费电影| 亚洲精品久久久久avwww潮水| 国产一区二区在线看| 91亚洲精品一区| 亚洲高清在线观看视频| 不卡的av网站| 免费毛片一区二区三区久久久| 美女毛片在线看| 欧美高清在线一区| 亚洲一区二区三区精品在线观看| 色网站免费在线观看| 亚洲视频综合在线| 欧美一级免费播放| 亚洲天堂av影院| 欧美在线播放高清精品| 欧美一级小视频| 99久久人爽人人添人人澡| 亚洲国产精品人久久电影| 3d动漫精品啪啪一区二区下载| 经典一区二区| 久热99视频在线观看| 久久综合久久鬼| 久久成人精品| 成人有码视频在线播放| 人妻精品一区一区三区蜜桃91| 91啦中文在线观看| 中日韩在线视频| av资源网在线播放| 欧美午夜精品一区二区蜜桃 | 成人听书哪个软件好| 久久人人九九| 视频一区二区三区不卡| 亚洲综合免费观看高清在线观看| www.爱色av.com| 日韩成人在线电影| 精品不卡在线视频| 日本午夜精品视频| 亚洲免费成人| 成人激情电影一区二区| 天天躁日日躁狠狠躁喷水| 国产精品卡一卡二| 国自产拍偷拍精品啪啪一区二区| www.久久.com| 亚洲国产三级网| 在线日韩国产网站| 性欧美长视频| 草莓视频一区| 日本在线播放| 色综合天天综合网天天狠天天| 久久久精品高清| 伊人精品一区| 久久久久久久久爱| 91成品人影院| 久久一夜天堂av一区二区三区| 中国女人做爰视频| 国产综合色区在线观看| 亚洲国产精品资源| 波多野结衣不卡视频| 青青草成人在线观看| 久久99精品国产99久久| 91精选在线| 欧美久久一二三四区| 中日韩精品一区二区三区| 亚洲激情视频小说| heyzo中文字幕在线| 欧美日韩视频第一区| 99精品欧美一区二区三区| 日韩av高清在线| 亚洲影院久久精品| 拔插拔插华人永久免费| 国产在线日韩精品| 91产国在线观看动作片喷水| 美女福利视频网| 亚洲小说春色综合另类电影| 亚洲视频在线免费观看| 日韩精品一区二区在线播放| 国内精品久久久久影院色| 日本精品免费| 午夜伦理福利在线| 亚洲精品按摩视频| 国产在线免费视频| 国产69精品一区二区亚洲孕妇| 日韩视频在线免费播放| 麻豆久久久久| 日韩中文字幕精品视频| 国产又大又黄的视频| 国产精品女同互慰在线看| 欧美日韩怡红院| 欧美日韩激情| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 欧美a级黄色大片| 亚洲青青久久| 麻豆国产精品va在线观看不卡| 在线免费观看高清视频| 国产精品系列在线| 精品999在线| 日韩在线观看| 91亚洲国产精品| 黄色成人在线网| 亚洲成人动漫在线播放| www.youjizz.com亚洲| 成人毛片在线观看| 欧美爱爱视频免费看| 日日狠狠久久偷偷综合色| 91sao在线观看国产| 欧美91精品久久久久国产性生爱| 日本精品视频一区二区三区| 免费黄在线观看| 久久97超碰国产精品超碰| 中文字幕在线乱| 亚洲小说春色综合另类电影| 97在线视频免费| 国产精品麻豆一区二区三区| 欧美日韩国产小视频| 爱爱视频免费在线观看| 成人97人人超碰人人99| 可以在线看的黄色网址| 欧美激情另类| 国产亚洲一区在线播放| 成人免费福利| 免费91麻豆精品国产自产在线观看| 欧美亚洲精品在线观看| 91国内精品野花午夜精品| 欧美手机在线观看| 成人国产在线观看| 九九视频精品在线观看| 午夜久久影院| 久久久久久久有限公司| 日本肉肉一区 | 最新国产一区| 国产69精品久久久久久| 91xxx在线观看| 精品少妇一区二区三区日产乱码| 国产无套丰满白嫩对白| 中文字幕综合网| 国产成人无码一区二区在线观看| 捆绑调教一区二区三区| 免费看毛片的网址| 日韩av大片| 精品蜜桃一区二区三区| 日韩有码欧美| 日产日韩在线亚洲欧美| 在线观看操人| 中文字幕日韩有码| 色天堂在线视频| 日韩视频一区在线观看| 伊人成年综合网| 亚洲aaa精品| 久久久久亚洲av无码专区体验| 久久综合狠狠综合久久综合88| 免费看的av网站| 日本va欧美va瓶| 中文字幕无码精品亚洲35| 无码一区二区三区视频| 日本在线观看一区| 久久99精品国产自在现线| 亚洲综合小说区| 国产一区二区三区四区五区3d| 高清欧美电影在线| 国产成人l区| 日韩一区视频在线| 国产在线色视频| 精品亚洲一区二区三区| 黄色片一区二区| 精品久久久久久久久久久久包黑料| 国产在成人精品线拍偷自揄拍| 色婷婷狠狠综合| 日韩特级黄色片| 欧美日韩精品在线播放| 国产第一页第二页| 一区二区视频免费在线观看| 手机在线中文字幕| 国产精品美女www爽爽爽| 人妻少妇无码精品视频区| 久久嫩草精品久久久精品一| 国产xxxxxxxxx| 成人a区在线观看| 亚洲精品激情视频| 懂色av一区二区夜夜嗨| 精品人妻一区二区三区免费| 国产自产视频一区二区三区| 91亚洲精品久久久蜜桃借种| 久久狠狠亚洲综合| 男操女免费网站| 久久国产剧场电影| 在线看的黄色网址| 蜜桃av一区二区在线观看| 在线观看av网页| 精品午夜久久福利影院| 中文字幕在线视频一区二区三区| 激情伊人五月天久久综合| 亚洲综合20p| 国产suv一区二区三区88区| 日本少妇一区二区三区| 国产69精品久久久久毛片| 在线免费看黄色片| 91在线国产福利| 国产一区二区三区四区五区六区| 91色视频在线| 又色又爽的视频| 亚洲欧美另类图片小说| 劲爆欧美第一页| 岛国av午夜精品| 天天爱天天做天天爽| 欧美久久久久久久久| 国产成人a人亚洲精品无码| 精品福利在线导航| 免费毛片在线| 社区色欧美激情 | 欧美寡妇性猛交xxx免费| 91成人免费观看网站| 成人在线视频免费看| 亚洲综合大片69999| 美日韩黄色大片| 亚洲欧洲三级| 午夜日韩福利| 亚洲国产精品久久久久爰色欲| 男人操女人的视频在线观看欧美| 中文字幕第三区| 99久久婷婷国产综合精品电影| 男人的天堂av网| 一区二区三区在线观看动漫| 久久免费激情视频| 欧美日韩国产大片| 少妇人妻一区二区| 在线成人一区二区| ririsao久久精品一区| 国产经典一区二区| 中文字幕一区二区三区四区久久| 鲁丝一区二区三区免费| 91成人免费| 欧美aⅴ在线观看| 国产成人午夜片在线观看高清观看| 五十路六十路七十路熟婆| 亚洲欧美综合在线精品| 精品成人免费视频| 欧美日本精品一区二区三区| 天天摸天天干天天操| 久久精品国产69国产精品亚洲| 美女网站在线看| 成人久久一区二区| 九九久久电影| 少妇高潮毛片色欲ava片| 麻豆精品一二三| 91av在线免费| 一区二区三区四区在线免费观看 | 精品一区二区国产| 亚洲色图欧美| 亚洲精品视频导航| 97久久人人超碰| 毛片a片免费观看| 欧美日韩电影一区| 国产高清免费av在线| 97国产真实伦对白精彩视频8| 国产精品一级在线观看| 日本成人黄色免费看| 在线视频亚洲| 日本精品一二三区| 亚洲视频一二区| 亚洲视频在线观看一区二区| 日韩精品中文字幕久久臀| 免费污视频在线观看| 91色琪琪电影亚洲精品久久| 精品国产一区二区三区噜噜噜| 欧美黑人经典片免费观看| 国产成人啪免费观看软件| 国产又粗又猛又爽又黄的视频小说| 日韩欧美国产激情| 午夜激情在线视频| 91精品国产91久久久久久久久| 亚洲一区二区三区四区电影| 午夜久久久久久久久久久| 久久激情综合网| 亚洲一区电影在线观看| 欧美老年两性高潮| 免费av网站在线看| 国产拍精品一二三| 久久视频在线| 777一区二区| 综合网在线视频| 97人妻一区二区精品免费视频| 日韩在线视频中文字幕| 国产在线日韩欧美| 国产伦精品一区二区三区视频女| 黑人巨大精品欧美一区免费视频 | 欧美mv和日韩mv国产网站| 菠萝菠萝蜜在线观看| 久久久久黄色片| 精品福利在线视频| www.成人免费视频| 不卡中文字幕av| 日韩中文字幕视频网| 国产又粗又大又爽的视频| 激情五月播播久久久精品| 午夜亚洲视频| 欧美深性狂猛ⅹxxx深喉| 午夜精品福利一区二区三区av| 人人妻人人澡人人爽精品日本| 久久免费高清视频| 麻豆精品99| 国产三区在线视频| 日韩电影免费观看高清完整| 欧美午夜18电影| 内射国产内射夫妻免费频道| 91美女在线视频| jizz国产在线观看| 在线观看日韩av| 国产精品一区二区三区av | 成人性生交大片免费看午夜| 国产精品91久久久| 久久在线视频免费观看| 先锋资源在线视频| 精品日韩美女的视频高清| 色综合久久久久综合体桃花网| av大全在线观看| 亚洲美女在线观看| 国产69精品久久| 伊人久久在线观看| 91在线精品一区二区| 中文人妻熟女乱又乱精品| 久久在线观看视频| 嫩草国产精品入口| 精品999在线| 亚洲成人1区2区| www视频在线观看免费| 亚洲a∨日韩av高清在线观看| 亚洲精品国产日韩| 人妻互换一区二区激情偷拍| 日韩精品一区在线| 四虎影视4hu4虎成人| 日韩不卡视频一区二区| 91美女福利视频| 国产又黄又粗又长| 欧美在线影院在线视频| 欧美一区高清| 国产美女免费网站| 影视亚洲一区二区三区| 国产精品久久国产三级国电话系列| 亚洲一区国产一区|