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

鴻蒙輕內核M核源碼分析系列九互斥鎖Mutex

開發
本文帶領大家一起剖析了鴻蒙輕內核的互斥鎖模塊的源代碼,包含互斥鎖的結構體、互斥鎖池初始化、互斥鎖創建刪除、申請釋放等。

[[401244]]

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

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

https://harmonyos.51cto.com

多任務環境下會存在多個任務訪問同一公共資源的場景,而有些公共資源是非共享的臨界資源,只能被獨占使用。鴻蒙輕內核使用互斥鎖來避免這種沖突,互斥鎖是一種特殊的二值性信號量,用于實現對臨界資源的獨占式處理。另外,互斥鎖可以解決信號量存在的優先級翻轉問題。用互斥鎖處理臨界資源的同步訪問時,如果有任務訪問該資源,則互斥鎖為加鎖狀態。此時其他任務如果想訪問這個臨界資源則會被阻塞,直到互斥鎖被持有該鎖的任務釋放后,其他任務才能重新訪問該公共資源,此時互斥鎖再次上鎖,如此確保同一時刻只有一個任務正在訪問這個臨界資源,保證了臨界資源操作的完整性。

接下來,我們看下互斥鎖的結構體,互斥鎖初始化,互斥鎖常用操作的源代碼。

1、互斥鎖結構體定義和常用宏定義

1.1 互斥鎖結構體定義

在文件kernel\include\los_mux.h定義的互斥鎖控制塊結構體LosMuxCB,源代碼如下,結構體成員的解釋見注釋部分。

  1. typedef struct { 
  2.     UINT8 muxStat;       /**< 互斥鎖狀態:OS_MUX_UNUSED, OS_MUX_USED */ 
  3.     UINT16 muxCount;     /**< 鎖被持有的次數 */ 
  4.     UINT32 muxID;        /**< 互斥鎖Id */ 
  5.     LOS_DL_LIST muxList; /**< 互斥鎖雙向鏈表 */ 
  6.     LosTaskCB *owner;    /**< 當前持有鎖的任務 */ 
  7.     UINT16 priority;     /**< 當前持有鎖的任務的優先級,為避免優先級翻轉,可能會更改任務的優先級,此時有備份的作用 */ 
  8. } LosMuxCB; 

 1.2 互斥鎖常用宏定義

系統支持創建多少互斥鎖是根據開發板情況使用宏LOSCFG_BASE_IPC_MUX_LIMIT定義的,互斥鎖muxId是UINT32類型的,muxId取值為[0,LOSCFG_BASE_IPC_MUX_LIMIT),表示互斥鎖池中各個的互斥鎖的編號。

  1. ⑴    #define OS_MUX_UNUSED 0 
  2.  
  3. ⑵    #define OS_MUX_USED   1 
  4.  
  5. ⑶    #define GET_MUX(muxid) (((LosMuxCB *)g_allMux) + (muxid)) 
  6.  
  7. ⑷    #define GET_MUX_LIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosMuxCB, muxList) 

 2、互斥鎖初始化

互斥鎖在內核中默認開啟,用戶可以通過宏LOSCFG_BASE_IPC_MUX進行關閉。開啟互斥鎖的情況下,在系統啟動時,在kernel\src\los_init.c中調用OsMuxInit()進行互斥鎖模塊初始化。

下面,我們分析下互斥鎖初始化的代碼。

⑴初始化雙向循環鏈表g_unusedMuxList,維護未使用的互斥鎖。

⑵處如果沒有設置宏LOSCFG_BASE_IPC_MUX,則返回錯誤碼。

⑶為互斥鎖申請內存,如果申請失敗,則返回錯誤LOS_ERRNO_MUX_NO_MEMORY

⑷循環每一個互斥鎖進行初始化,為每一個互斥鎖節點指定索引muxID,muxStat為未使用OS_MUX_UNUSED,并把互斥鎖節點插入未使用互斥鎖雙向鏈表g_unusedMuxList。

(5)如果開啟了互斥鎖調測開關,則調用函數UINT32 OsMuxDbgInit(VOID)進行初始化。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsMuxInit(VOID) 
  2.     LosMuxCB *muxNode = NULL
  3.     UINT32 index
  4.  
  5. ⑴  LOS_ListInit(&g_unusedMuxList); 
  6.  
  7. ⑵  if (LOSCFG_BASE_IPC_MUX_LIMIT == 0) { 
  8.         return LOS_ERRNO_MUX_MAXNUM_ZERO; 
  9.     } 
  10.  
  11. ⑶  g_allMux = (LosMuxCB *)LOS_MemAlloc(m_aucSysMem0, (LOSCFG_BASE_IPC_MUX_LIMIT * sizeof(LosMuxCB))); 
  12.     if (g_allMux == NULL) { 
  13.         return LOS_ERRNO_MUX_NO_MEMORY; 
  14.     } 
  15.  
  16. ⑷  for (index = 0; index < LOSCFG_BASE_IPC_MUX_LIMIT; index++) { 
  17.         muxNode = ((LosMuxCB *)g_allMux) + index
  18.         muxNode->muxID = index
  19.         muxNode->muxStat = OS_MUX_UNUSED; 
  20.         LOS_ListTailInsert(&g_unusedMuxList, &muxNode->muxList); 
  21.     } 
  22.     return LOS_OK; 

 3、互斥鎖常用操作

3.1 互斥鎖創建

我們可以使用函數UINT32 LOS_MuxCreate(UINT32 *muxHandle)來創建互斥鎖,下面通過分析源碼看看如何創建互斥鎖的。

⑴判斷未使用互斥鎖鏈表g_unusedMuxList是否為空,如果沒有可以使用的互斥鎖,跳轉到錯誤碼。

⑵處如果g_unusedMuxList不為空,則獲取第一個可用的互斥鎖節點,接著從雙向鏈表g_unusedMuxList中刪除,然后調用GET_MUX_LIST宏函數獲取LosMuxCB *muxCreated,接著初始化創建的互斥鎖信息,包含持有鎖的次數、狀態、優先級等信息。

⑶初始化雙向鏈表&muxCreated->muxList,阻塞在這個互斥鎖上的任務會掛在這個鏈表上。

⑷賦值給輸出參數*muxHandle,后續程序使用這個互斥鎖Id對互斥鎖進行其他操作。

  1. LITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxCreate(UINT32 *muxHandle) 
  2.     UINT32 intSave; 
  3.     LosMuxCB *muxCreated = NULL
  4.     LOS_DL_LIST *unusedMux = NULL
  5.     UINT32 errNo; 
  6.     UINT32 errLine; 
  7.  
  8.     if (muxHandle == NULL) { 
  9.         return LOS_ERRNO_MUX_PTR_NULL; 
  10.     } 
  11.  
  12.     intSave = LOS_IntLock(); 
  13. ⑴  if (LOS_ListEmpty(&g_unusedMuxList)) { 
  14.         LOS_IntRestore(intSave); 
  15.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_ALL_BUSY); 
  16.     } 
  17.  
  18. ⑵  unusedMux = LOS_DL_LIST_FIRST(&(g_unusedMuxList)); 
  19.     LOS_ListDelete(unusedMux); 
  20.     muxCreated = (GET_MUX_LIST(unusedMux)); 
  21.     muxCreated->muxCount = 0; 
  22.     muxCreated->muxStat = OS_MUX_USED; 
  23.     muxCreated->priority = 0; 
  24.     muxCreated->owner = (LosTaskCB *)NULL
  25. ⑶  LOS_ListInit(&muxCreated->muxList); 
  26. ⑷  *muxHandle = (UINT32)muxCreated->muxID; 
  27.     LOS_IntRestore(intSave); 
  28.     OsHookCall(LOS_HOOK_TYPE_MUX_CREATE, muxCreated); 
  29.     return LOS_OK; 
  30. ERR_HANDLER: 
  31.     OS_RETURN_ERROR_P2(errLine, errNo); 

 3.2 互斥鎖刪除

我們可以使用函數LOS_MuxDelete(UINT32 muxHandle)來刪除互斥鎖,下面通過分析源碼看看如何刪除互斥鎖的。

⑴處判斷互斥鎖muxHandle是否超過LOSCFG_BASE_IPC_MUX_LIMIT,如果超過則返回錯誤碼。

⑵獲取互斥鎖控制塊LosMuxCB *muxDeleted。

⑶如果要刪除的互斥鎖處于未使用狀態,跳轉到錯誤標簽進行處理。

⑷如果互斥鎖的持有者數量不為空,不允許刪除,跳轉到錯誤標簽進行處理。

⑸把刪除的互斥鎖回收到未使用互斥鎖雙向鏈表g_unusedMuxList,然后更新為未使用狀態。

  1. LITE_OS_SEC_TEXT_INIT UINT32 LOS_MuxDelete(UINT32 muxHandle) 
  2.     UINT32 intSave; 
  3.     LosMuxCB *muxDeleted = NULL
  4.     UINT32 errNo; 
  5.     UINT32 errLine; 
  6.  
  7. ⑴  if (muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) { 
  8.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_INVALID); 
  9.     } 
  10.  
  11. ⑵  muxDeleted = GET_MUX(muxHandle); 
  12.     intSave = LOS_IntLock(); 
  13. ⑶  if (muxDeleted->muxStat == OS_MUX_UNUSED) { 
  14.         LOS_IntRestore(intSave); 
  15.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_INVALID); 
  16.     } 
  17.  
  18. ⑷  if ((!LOS_ListEmpty(&muxDeleted->muxList)) || muxDeleted->muxCount) { 
  19.         LOS_IntRestore(intSave); 
  20.         OS_GOTO_ERR_HANDLER(LOS_ERRNO_MUX_PENDED); 
  21.     } 
  22.  
  23. ⑸  LOS_ListAdd(&g_unusedMuxList, &muxDeleted->muxList); 
  24.     muxDeleted->muxStat = OS_MUX_UNUSED; 
  25.  
  26.     LOS_IntRestore(intSave); 
  27.  
  28.     OsHookCall(LOS_HOOK_TYPE_MUX_DELETE, muxDeleted); 
  29.     return LOS_OK; 
  30. ERR_HANDLER: 
  31.     OS_RETURN_ERROR_P2(errLine, errNo); 

 3.3 互斥鎖申請

我們可以使用函數UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)來請求互斥鎖,需要的2個參數分別是互斥鎖Id和等待時間timeout,單位Tick,取值范圍為[0, LOS_WAIT_FOREVER]。

下面通過分析源碼看看如何請求互斥鎖的。

申請互斥鎖時首先會進行互斥鎖Id、參數的合法性校驗,這些比較簡單。

⑴處代碼獲取當前運行的任務,

⑵如果互斥鎖沒有被持有,更新互斥鎖的持有次數、持有者信息和優先級,完成互斥鎖的申請。

⑶處如果互斥鎖的持有次數不為0,并且被當前任務持有,可以持有次數加1,再次嵌套持有,完成互斥鎖的申請。如果代碼執行到,

⑷說明申請的互斥鎖被其他任務持有著,此時如果等待時間為0,則申請失敗返回。

⑸處更新當前任務阻塞在申請的互斥鎖上。

⑹處代碼表示在當前申請互斥鎖的任務優先級高于持有互斥鎖的任務優先級時,修改持有互斥鎖的優先級為當前任務的優先級。通過這樣的修改,可以避免優先級翻轉。

⑺處調用函數OsSchedTaskWait()更新當前任務的狀態,設置等待時間,然后調用函數LOS_Schedule觸發任務調度。后續程序暫時不再執行,需要等到可以獲取互斥鎖或者時間超時。

如果時間超時或者申請到互斥鎖,系統重新調度到執行此任務,程序從⑻處繼續執行。如果是時間超時,⑼處更新任務狀態并返回碼,申請互斥鎖失敗。如果成功申請到互斥鎖,執行⑽,返回成功。

  1. LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout) 
  2.     UINT32 intSave; 
  3.     LosMuxCB *muxPended = NULL
  4.     UINT32 retErr; 
  5.     LosTaskCB *runningTask = NULL
  6.  
  7.     if (muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) { 
  8.         OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID); 
  9.     } 
  10.  
  11.     muxPended = GET_MUX(muxHandle); 
  12.     intSave = LOS_IntLock(); 
  13.     retErr = OsMuxValidCheck(muxPended); 
  14.     if (retErr) { 
  15.         goto ERROR_MUX_PEND; 
  16.     } 
  17.  
  18. ⑴  runningTask = (LosTaskCB *)g_losTask.runTask; 
  19. ⑵  if (muxPended->muxCount == 0) { 
  20.         muxPended->muxCount++; 
  21.         muxPended->owner = runningTask; 
  22.         muxPended->priority = runningTask->priority; 
  23.         LOS_IntRestore(intSave); 
  24.         goto HOOK; 
  25.     } 
  26.  
  27. ⑶  if (muxPended->owner == runningTask) { 
  28.         muxPended->muxCount++; 
  29.         LOS_IntRestore(intSave); 
  30.         goto HOOK; 
  31.     } 
  32.  
  33. ⑷  if (!timeout) { 
  34.         retErr = LOS_ERRNO_MUX_UNAVAILABLE; 
  35.         goto ERROR_MUX_PEND; 
  36.     } 
  37.  
  38. ⑸  runningTask->taskMux = (VOID *)muxPended; 
  39.  
  40. ⑹  if (muxPended->owner->priority > runningTask->priority) { 
  41.         (VOID)OsSchedModifyTaskSchedParam(muxPended->owner, runningTask->priority); 
  42.     } 
  43.  
  44. ⑺  OsSchedTaskWait(&muxPended->muxList, timeout); 
  45.  
  46.     LOS_IntRestore(intSave); 
  47.     OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended); 
  48.     LOS_Schedule(); 
  49.  
  50. ⑻  intSave = LOS_IntLock(); 
  51.     if (runningTask->taskStatus & OS_TASK_STATUS_TIMEOUT) { 
  52. ⑼      runningTask->taskStatus &= (~OS_TASK_STATUS_TIMEOUT); 
  53.         retErr = LOS_ERRNO_MUX_TIMEOUT; 
  54.         goto ERROR_MUX_PEND; 
  55.     } 
  56.  
  57.     LOS_IntRestore(intSave); 
  58. ⑽  return LOS_OK; 
  59.  
  60. HOOK: 
  61.     OsHookCall(LOS_HOOK_TYPE_MUX_PEND, muxPended); 
  62.     return LOS_OK; 
  63.  
  64. ERROR_MUX_PEND: 
  65.     LOS_IntRestore(intSave); 
  66.     OS_RETURN_ERROR(retErr); 

 3.4 互斥鎖釋放

我們可以使用函數UINT32 LOS_MuxPost(UINT32 muxHandle)來釋放互斥鎖,下面通過分析源碼看看如何釋放互斥鎖的。

釋放互斥鎖時首先會進行互斥鎖Id、參數的合法性校驗,這些比較簡單,自行閱讀即可。

⑴處如果要釋放的互斥鎖沒有被持有、或者不是被當前任務持有,返回錯誤碼。

⑵互斥鎖的持有數量減1,如果不為0,當前任務嵌套持有該互斥鎖,不需要調度,返回釋放互斥鎖成功。如果釋放一次后,當前任務不再持有互斥鎖,則執行。

⑶如果持有互斥鎖任務的優先級不等于互斥鎖的備份優先級低,需要恢復當前任務的優先級。

⑷如果互斥鎖上還有其他任務阻塞著,獲取阻塞的任務resumedTask,該任務成功獲取到互斥鎖,然后執行。

⑸更新互斥鎖的持有信息。執行⑹更新任務resumedTask的狀態,然后調用函數LOS_Schedule觸發調度。

  1. LITE_OS_SEC_TEXT UINT32 LOS_MuxPost(UINT32 muxHandle) 
  2.     UINT32 intSave; 
  3.     LosMuxCB *muxPosted = GET_MUX(muxHandle); 
  4.     LosTaskCB *resumedTask = NULL
  5.     LosTaskCB *runningTask = NULL
  6.  
  7.     intSave = LOS_IntLock(); 
  8.  
  9.     if ((muxHandle >= (UINT32)LOSCFG_BASE_IPC_MUX_LIMIT) || 
  10.         (muxPosted->muxStat == OS_MUX_UNUSED)) { 
  11.         LOS_IntRestore(intSave); 
  12.         OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID); 
  13.     } 
  14.  
  15.     runningTask = (LosTaskCB *)g_losTask.runTask; 
  16. ⑴  if ((muxPosted->muxCount == 0) || (muxPosted->owner != runningTask)) { 
  17.         LOS_IntRestore(intSave); 
  18.         OS_RETURN_ERROR(LOS_ERRNO_MUX_INVALID); 
  19.     } 
  20.  
  21. ⑵  if (--(muxPosted->muxCount) != 0) { 
  22.         LOS_IntRestore(intSave); 
  23.         OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted); 
  24.         return LOS_OK; 
  25.     } 
  26.  
  27. ⑶  if ((muxPosted->owner->priority) != muxPosted->priority) { 
  28.         (VOID)OsSchedModifyTaskSchedParam(muxPosted->owner, muxPosted->priority); 
  29.     } 
  30.  
  31. ⑷  if (!LOS_ListEmpty(&muxPosted->muxList)) { 
  32.         resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(muxPosted->muxList))); 
  33.  
  34. ⑸      muxPosted->muxCount = 1; 
  35.         muxPosted->owner = resumedTask; 
  36.         muxPosted->priority = resumedTask->priority; 
  37.         resumedTask->taskMux = NULL
  38.  
  39. ⑹      OsSchedTaskWake(resumedTask); 
  40.  
  41.         LOS_IntRestore(intSave); 
  42.         OsHookCall(LOS_HOOK_TYPE_MUX_POST, muxPosted); 
  43.         LOS_Schedule(); 
  44.     } else { 
  45.         LOS_IntRestore(intSave); 
  46.     } 
  47.  
  48.     return LOS_OK; 

 小結

本文帶領大家一起剖析了鴻蒙輕內核的互斥鎖模塊的源代碼,包含互斥鎖的結構體、互斥鎖池初始化、互斥鎖創建刪除、申請釋放等。

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

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

https://harmonyos.51cto.com

 

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

2021-05-27 09:43:56

鴻蒙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-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-06-09 09:48:01

鴻蒙HarmonyOS應用

2021-05-21 09:25:11

鴻蒙HarmonyOS應用

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2021-05-10 15:05:56

鴻蒙HarmonyOS應用

2021-04-30 15:06:34

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

99精品综合| 97成人超碰| caoporm超碰国产精品| 51精品国产黑色丝袜高跟鞋| 亚洲AV无码国产精品| 日韩欧美精品电影| 亚洲精品午夜久久久| 九九九九九精品| 免费看av在线| 亚洲青色在线| 中文字幕不卡在线视频极品| 成人一区二区三区仙踪林| 第84页国产精品| 亚洲黄色小说网站| 视频一区二区三| 无码精品在线观看| 国产一区视频网站| 4444欧美成人kkkk| 青娱乐在线视频免费观看| 精品女人视频| 欧美一级夜夜爽| 成人免费xxxxx在线视频| 少女频道在线观看免费播放电视剧 | 精品中文视频在线| av在线免费看片| 吉吉日韩欧美| 午夜精品成人在线| 亚洲免费视频播放| 99re热久久这里只有精品34| 99久久99久久精品免费看蜜桃| 91手机视频在线观看| 无码人妻熟妇av又粗又大| 亚洲激情女人| 欧美日韩电影在线观看| 国精产品一区一区| 国产免费av一区二区三区| 亚洲成年人在线| 国内av免费观看| 成人自拍视频| 欧美精品黑人性xxxx| 日韩一级在线免费观看| 亚洲精品动漫| 欧美性猛交xxxx免费看| 我的公把我弄高潮了视频| 99热国产在线| 一区二区久久久久| 黄色特一级视频| 操你啦视频在线| 亚洲人成网站精品片在线观看| 亚洲一区二区三区在线观看视频| 精品三级久久久久久久电影聊斋| 91视频你懂的| 麻豆av一区二区| 蜜桃视频在线播放| 久久看人人爽人人| 国产日韩欧美综合精品| 色呦呦中文字幕| 成人免费不卡视频| 久久久久久久久久码影片| 天堂在线视频免费观看| 99国产精品国产精品久久| 久久久久高清| 精品无吗乱吗av国产爱色| 国产午夜三级一区二区三| 视频一区视频二区视频三区高| 欧美日韩国产精品一卡| 国产精品系列视频| 国产乱淫av一区二区三区 | 亚洲乱码日产精品bd在线观看| 理论片午午伦夜理片在线播放| 综合在线观看色| 日本中文字幕一级片| 免费电影网站在线视频观看福利| 亚洲一区二区三区影院| 夫妻免费无码v看片| 亚洲黄色中文字幕| 欧美午夜视频网站| 午夜大片在线观看| 一区二区三区免费在线看| 亚洲国产欧美在线成人app| 野外性满足hd| 欧美丝袜激情| 久久久精品在线观看| 免费一级全黄少妇性色生活片| 黄色成人av网站| 欧洲亚洲免费在线| 正在播放木下凛凛xv99| 国内精品第一页| 精品视频一区二区三区四区| 搞黄视频在线观看| 亚洲精品网站在线观看| 成人毛片一区二区| 黄色欧美视频| 亚洲成av人影院在线观看| 国产精品一二三区在线观看| 999成人网| 国模gogo一区二区大胆私拍| 国产日韩在线免费观看| 国产成人福利片| 免费av在线一区二区| 黄色国产网站在线播放| 亚洲超碰97人人做人人爱| 日韩无套无码精品| 亚洲国产中文在线| 在线成人一区二区| 久热这里只有精品在线| 日韩电影在线一区二区三区| 翡翠波斯猫1977年美国| 超碰在线国产| 红桃av永久久久| 日本高清一区二区视频| 亚洲第一二三区| 欧美黑人巨大xxx极品| 波多野结衣在线电影| 处破女av一区二区| 做爰高潮hd色即是空| 国产伦精品一区二区三区视频金莲| 91精品在线免费观看| 国产又爽又黄无码无遮挡在线观看| 91精品电影| 国产精品久久久亚洲| 天堂av在线免费| 一区二区理论电影在线观看| 亚洲黄色av片| 日本一区二区三区视频| 欧美一级电影久久| 欧美自拍偷拍一区二区| 亚洲欧美日韩小说| 三级av免费观看| 国产亚洲欧美日韩在线观看一区二区 | 国内精品国语自产拍在线观看| 蜜桃视频网站在线| 欧美男女性生活在线直播观看| av网在线播放| 亚洲一区日韩在线| 韩国成人一区| 超免费在线视频| 日韩精品在线一区二区| 成年人一级黄色片| 美美哒免费高清在线观看视频一区二区 | 自拍av一区二区三区| 奇米影音第四色| 国产欧美高清视频在线| 欧美壮男野外gaytube| 污污视频在线观看网站| 亚州成人在线电影| 亚洲午夜久久久久久久久| 欧美激情偷拍| 国产99午夜精品一区二区三区| av大片在线| 精品国产三级a在线观看| 国产女片a归国片aa| 国产综合色视频| 男女激烈动态图| 国产专区精品| 欧美情侣性视频| 丰满人妻一区二区三区无码av| 一区二区激情小说| 午夜剧场免费看| 在线综合视频| 欧美日韩一区在线播放| 成人黄色免费观看| 最近2019免费中文字幕视频三 | 亚洲一区二区三区在线观看视频| 欧美一级做一级爱a做片性| 上原亚衣av一区二区三区| 国产美女精品视频国产| 亚洲精品国产第一综合99久久 | 国产乱码精品一区二三区蜜臂 | 人人妻人人澡人人爽欧美一区双 | 亚洲丁香久久久| 亚洲男人的天堂在线视频| 久久蜜桃av一区二区天堂| 国产v亚洲v天堂无码久久久| 99九九热只有国产精品| 99国产高清| 自拍在线观看| 中文日韩在线视频| 超碰福利在线观看| 欧美日韩国产丝袜美女| 五月天精品在线| 国产精品88888| 日韩a在线播放| 成人免费看片39| 5566av亚洲| 中文av在线全新| 精品国产一区二区三区四区在线观看| 99久久一区二区| 欧美日韩国产精品一区| 久久精品在线观看视频| 成人午夜激情在线| 久久久久久久少妇| 欧美涩涩网站| 青青草原亚洲| 一区二区日韩| 国产精品久久视频| www.8ⅹ8ⅹ羞羞漫画在线看| 国产亚洲xxx| 亚洲AV无码成人片在线观看| 欧美亚洲精品一区| 久久亚洲国产成人精品性色| 国产欧美一区二区精品仙草咪| 午夜激情视频网| 丝袜美腿亚洲色图| 欧美黑人在线观看| 日本不卡二三区| 国产伦精品一区二区三区视频免费| 国产成人免费9x9x人网站视频| 色综合老司机第九色激情| 国产爆初菊在线观看免费视频网站| 精品欧美黑人一区二区三区| 中文字幕第99页| 午夜a成v人精品| 中文字幕在线有码| 中文字幕欧美激情一区| 国产+高潮+白浆+无码| 国产真实乱偷精品视频免| 精品中文字幕av| 欧美日本不卡| 欧美日韩视频免费在线观看| 国产精品最新| 久久精品美女| 99精品国产高清一区二区麻豆| 国产欧美亚洲视频| 神马久久资源| 欧美野外猛男的大粗鳮| 福利在线导航136| 美女国内精品自产拍在线播放| 成人免费在线视频网| 日韩精品视频在线免费观看| 亚洲第一视频在线播放| 欧美一区二区三区免费观看视频| 日韩av免费播放| 日本乱人伦一区| 国产www在线| 欧美日韩中文字幕在线视频| 国产一卡二卡在线| 亚洲一区二区av电影| 中文字幕另类日韩欧美亚洲嫩草| 最新国产精品久久精品| 成年人网站在线观看视频| 日本一区二区成人在线| 亚洲午夜福利在线观看| 91视视频在线观看入口直接观看www| 精品国产乱码久久久久夜深人妻| 国产69精品久久久久毛片| 日本中文字幕精品—区二区| 久久成人免费电影| 在线观看免费不卡av| 国内精品写真在线观看| 亚洲日本黄色片| 国产精品一品视频| 欧洲在线免费视频| 风间由美一区二区三区在线观看| 日韩av福利在线观看| 国产乱国产乱300精品| 男生和女生一起差差差视频| 国产精品 欧美精品| 少妇伦子伦精品无吗| 国产成a人亚洲| 99re这里只有| 久久综合资源网| a天堂中文字幕| 国产精品色眯眯| 麻豆精品国产免费| 一区二区三区蜜桃网| 日本熟妇毛耸耸xxxxxx| 色婷婷久久99综合精品jk白丝 | 免费看黄色91| 想看黄色一级片| 国产91精品欧美| 国产三级国产精品| 国产欧美一区二区精品秋霞影院 | 日韩精品视频在线观看一区二区三区| 亚洲美女久久久| 91电影在线播放| 欧美成人免费观看| 蜜桃视频在线观看免费视频| 青青久久av北条麻妃黑人| 成人黄色免费观看| 成人午夜电影在线播放| 亚洲人成网站77777在线观看| 亚洲国产欧洲综合997久久| 亚洲成人二区| 中国丰满人妻videoshd| 久久精品国产亚洲aⅴ| 激情av中文字幕| 久久精品一区蜜桃臀影院| 久久精品日韩无码| 亚洲6080在线| 最近中文字幕免费在线观看| 欧美电视剧在线看免费| 免费一级毛片在线观看| 欧美成年人在线观看| 国产精品极品美女在线观看| 亚洲一区中文字幕| 猛男gaygay欧美视频| 免费国产成人看片在线| 香蕉久久夜色精品| 特黄特黄一级片| 国产调教视频一区| 久久精品免费av| 欧美日高清视频| 手机看片福利永久| 久久夜色精品国产| 日本在线影院| 98国产高清一区| 成人国产精品一级毛片视频| 精品无码国模私拍视频| 国产一区中文字幕| 久久久久亚洲av无码a片| 亚洲电影在线免费观看| 国产精品熟女久久久久久 | 在线欧美三级| 国产精品嫩草影院久久久| 欧美精品中文| 亚洲爆乳无码精品aaa片蜜桃| 免费高清视频精品| 无码熟妇人妻av| 天天色天天操综合| 成人激情四射网| 久久伊人精品天天| 91国拍精品国产粉嫩亚洲一区 | 激情成人在线观看| 国产日产欧美一区二区视频| 亚欧视频在线观看| 日韩欧美一区中文| 精品自拍一区| 成人免费午夜电影| 日本一区二区在线看| 美女网站免费观看视频| 久久一二三国产| 国产91精品一区| 亚洲精品久久视频| 678在线观看视频| 国产伦精品一区二区三区照片| 欧美韩国一区| 337p日本欧洲亚洲大胆张筱雨| 亚洲视频小说图片| 国产精品无码久久av| 久久精品久久久久| 精品久久国产一区| 水蜜桃在线免费观看| 国产一区二区调教| 欧美成人三级视频| 日韩精品一区二区三区在线播放| free性欧美hd另类精品| 亚洲aaa激情| 欧美日韩国产一区精品一区| 亚洲熟妇一区二区| 亚洲成人av一区二区三区| 国内爆初菊对白视频| 久久久久久成人| 欧美精品中文| 香蕉视频网站入口| 国产精品女同一区二区三区| 在线观看毛片网站| 久久视频在线免费观看| 亚州一区二区| 国产真人做爰毛片视频直播| 99国产欧美久久久精品| 无码视频在线观看| 在线看欧美日韩| 91成人福利社区| 成人免费在线视频播放| av不卡免费电影| 日日夜夜操视频| 中文字幕亚洲国产| 视频精品国内| 免费成人在线视频网站| 国产婷婷一区二区| 国产剧情久久久| 7777kkkk成人观看| 国产影视一区| 欧美激情第一区| 亚洲国产一区视频| 男女污视频在线观看| 成人免费网站在线看| 91久久亚洲| 东方伊人免费在线观看| 日韩视频在线观看一区二区| 91超碰国产在线| 亚洲成人av动漫| 成人综合婷婷国产精品久久| 午夜影院免费在线观看| 北条麻妃在线一区二区| 国产福利一区二区精品秒拍| 亚洲色图久久久| 亚洲一区二区三区影院| 成人精品一区二区| 99国产精品久久久久老师| 日韩精品免费专区| 日韩欧美中文字幕视频| 亚洲欧美福利视频| 国产一区一区| 日本美女高潮视频| 亚洲国产成人porn| 香蕉视频免费在线播放| 国产亚洲情侣一区二区无| 精品无人码麻豆乱码1区2区|