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

鴻蒙內核源碼分析(事件控制篇) | 任務間多對多的同步方案

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

[[392639]]

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

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

https://harmonyos.51cto.com

官方概述

先看官方對事件的描述.

事件(Event)是一種任務間通信的機制,可用于任務間的同步。

多任務環境下,任務之間往往需要同步操作,一個等待即是一個同步。事件可以提供一對多、多對多的同步操作。

● 一對多同步模型:一個任務等待多個事件的觸發。可以是任意一個事件發生時喚醒任務處理事件,也可以是幾個事件都發生后才喚醒任務處理事件。

● 多對多同步模型:多個任務等待多個事件的觸發。

鴻蒙提供的事件具有如下特點:

● 任務通過創建事件控制塊來觸發事件或等待事件。

● 事件間相互獨立,內部實現為一個32位無符號整型,每一位標識一種事件類型。第25位不可用,因此最多可支持31種事件類型。

● 事件僅用于任務間的同步,不提供數據傳輸功能。

● 多次向事件控制塊寫入同一事件類型,在被清零前等效于只寫入一次。

● 多個任務可以對同一事件進行讀寫操作。

● 支持事件讀寫超時機制。

再看事件圖

注意圖中提到了三個概念 事件控制塊 事件 任務 接下來結合代碼來理解事件模塊的實現.

事件控制塊長什么樣?

  1. typedef struct tagEvent { 
  2.     UINT32 uwEventID;        /**< Event mask in the event control block,//標識發生的事件類型位,事件ID,每一位標識一種事件類型 
  3.                                   indicating the event that has been logically processed. */ 
  4.     LOS_DL_LIST stEventList; /**< Event control block linked list *///讀取事件任務鏈表 
  5. } EVENT_CB_S, *PEVENT_CB_S; 

事件控制塊<>事件<>任務 三者關系

一定要搞明白這三者的關系,否則搞不懂事件模塊是如何運作的.

● 任務是事件的生產者,通過 LOS_EventWrite,向外部廣播發生了XX事件,并喚醒此前已在事件控制塊中登記過的要等待XX事件發生的XX任務.

● 事件控制塊EVENT_CB_S 是記錄者,只干兩件事件:

1.uwEventID按位記錄哪些事件發生了,它只是記錄,怎么消費它不管的.

2.stEventList記錄哪些任務在等待事件,但任務究竟在等待哪些事件它也是不記錄的

● 任務也是消費者,通過 LOS_EventRead消費,只有任務自己清楚要以什么樣的方式,消費什么樣的事件. 先回顧下任務結構體 LosTaskCB 對事件部分的描述如下:

  1. typedef struct { 
  2.     //...去掉不相關的部分 
  3.     VOID            *taskEvent;  //和任務發生關系的事件控制塊 
  4.     UINT32          eventMask;   //對哪些事件進行屏蔽 
  5.     UINT32          eventMode;   //事件三種模式(LOS_WAITMODE_AND,LOS_WAITMODE_OR,LOS_WAITMODE_CLR) 
  6. } LosTaskCB;     

taskEvent 指向的就是 EVENT_CB_S

eventMask 屏蔽掉 事件控制塊 中的哪些事件

eventMode 已什么樣的方式去消費事件,三種讀取模式

  1. #define LOS_WAITMODE_AND                    4U   
  2. #define LOS_WAITMODE_OR                     2U   
  3. #define LOS_WAITMODE_CLR                    1U   

◊ 所有事件(LOS_WAITMODE_AND):邏輯與,基于接口傳入的事件類型掩碼eventMask,只有這些事件都已經發生才能讀取成功,否則該任務將阻塞等待或者返回錯誤碼。

◊ 任一事件(LOS_WAITMODE_OR):邏輯或,基于接口傳入的事件類型掩碼eventMask,只要這些事件中有任一種事件發生就可以讀取成功,否則該任務將阻塞等待或者返回錯誤碼。

◊ 清除事件(LOS_WAITMODE_CLR):這是一種附加讀取模式,需要與所有事件模式或任一事件模式結合使用(LOS_WAITMODE_AND | LOS_WAITMODE_CLR或 LOS_WAITMODE_OR | LOS_WAITMODE_CLR)。在這種模式下,當設置的所有事件模式或任一事件模式讀取成功后,會自動清除事件控制塊中對應的事件類型位。

● 一個事件控制塊EVENT_CB_S中的事件可以來自多個任務,多個任務也可以同時消費事件控制塊中的事件,并且這些任務之間可以沒有任何關系!

函數列表

事件可應用于多種任務同步場景,在某些同步場景下可替代信號量。

其中讀懂 OsEventWrite 和 OsEventRead 就明白了事件模塊.

事件初始化 -> LOS_EventInit

  1. //初始化一個事件控制塊 
  2. LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB) 
  3.     UINT32 intSave; 
  4.     intSave = LOS_IntLock();//鎖中斷 
  5.     eventCB->uwEventID = 0; //其中每一位表示一種事件類型(0表示該事件類型未發生、1表示該事件類型已經發生) 
  6.     LOS_ListInit(&eventCB->stEventList);//事件鏈表初始化 
  7.     LOS_IntRestore(intSave);//恢復中斷 
  8.     return LOS_OK; 

代碼解讀:

● 事件是共享資源,所以操作期間不能產生中斷.

● 初始化兩個記錄者 uwEventID stEventList

事件生產過程 -> OsEventWrite

  1. LITE_OS_SEC_TEXT VOID OsEventWriteUnsafe(PEVENT_CB_S eventCB, UINT32 events, BOOL once, UINT8 *exitFlag) 
  2.     LosTaskCB *resumedTask = NULL
  3.     LosTaskCB *nextTask = NULL
  4.     BOOL schedFlag = FALSE
  5.  
  6.     eventCB->uwEventID |= events;//對應位貼上標簽 
  7.     if (!LOS_ListEmpty(&eventCB->stEventList)) {//等待事件鏈表判斷,處理等待事件的任務 
  8.         for (resumedTask = LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext, LosTaskCB, pendList); 
  9.              &resumedTask->pendList != &eventCB->stEventList;) {//循環獲取任務鏈表 
  10.             nextTask = LOS_DL_LIST_ENTRY(resumedTask->pendList.pstNext, LosTaskCB, pendList);//獲取任務實體 
  11.             if (OsEventResume(resumedTask, eventCB, events)) {//是否恢復任務 
  12.                 schedFlag = TRUE;//任務已加至就緒隊列,申請發生一次調度 
  13.             } 
  14.             if (once == TRUE) {//是否只處理一次任務 
  15.                 break;//退出循環 
  16.             } 
  17.             resumedTask = nextTask;//檢查鏈表中下一個任務 
  18.         } 
  19.     } 
  20.  
  21.     if ((exitFlag != NULL) && (schedFlag == TRUE)) {//是否讓外面調度 
  22.         *exitFlag = 1; 
  23.     } 
  24. //寫入事件 
  25. LITE_OS_SEC_TEXT STATIC UINT32 OsEventWrite(PEVENT_CB_S eventCB, UINT32 events, BOOL once) 
  26.     UINT32 intSave; 
  27.     UINT8 exitFlag = 0; 
  28.  
  29.     SCHEDULER_LOCK(intSave);    //禁止調度 
  30.     OsEventWriteUnsafe(eventCB, events, once, &exitFlag);//寫入事件 
  31.     SCHEDULER_UNLOCK(intSave);  //允許調度 
  32.  
  33.     if (exitFlag == 1) { //需要發生調度 
  34.         LOS_MpSchedule(OS_MP_CPU_ALL);//通知所有CPU調度 
  35.         LOS_Schedule();//執行調度 
  36.     } 
  37.     return LOS_OK; 

代碼解讀:

1.給對應位貼上事件標簽,eventCB->uwEventID |= events; 注意uwEventID是按位管理的.每個位代表一個事件是否寫入,例如 uwEventID = 00010010 代表產生了 1,4 事件

2.循環從stEventList鏈表中取出等待這個事件的任務判斷是否喚醒任務. OsEventResume

  1. //事件恢復,判斷是否喚醒任務 
  2. LITE_OS_SEC_TEXT STATIC UINT8 OsEventResume(LosTaskCB *resumedTask, const PEVENT_CB_S eventCB, UINT32 events) 
  3.     UINT8 exitFlag = 0;//是否喚醒 
  4.  
  5.     if (((resumedTask->eventMode & LOS_WAITMODE_OR) && ((resumedTask->eventMask & events) != 0)) || 
  6.         ((resumedTask->eventMode & LOS_WAITMODE_AND) && 
  7.         ((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {//邏輯與 和 邏輯或 的處理 
  8.         exitFlag = 1;  
  9.  
  10.         resumedTask->taskEvent = NULL
  11.         OsTaskWake(resumedTask);//喚醒任務,加入就緒隊列 
  12.     } 
  13.  
  14.     return exitFlag; 

3.喚醒任務OsTaskWake只是將任務重新加入就緒隊列,需要立即申請一次調度 LOS_Schedule .

事件消費過程 -> OsEventRead

  1. LITE_OS_SEC_TEXT STATIC UINT32 OsEventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout, 
  2.                                            BOOL once) 
  3.     UINT32 ret; 
  4.     UINT32 intSave; 
  5.     SCHEDULER_LOCK(intSave); 
  6.     ret = OsEventReadImp(eventCB, eventMask, mode, timeout, once);//讀事件實現函數 
  7.     SCHEDULER_UNLOCK(intSave); 
  8.     return ret; 
  9.  
  10. //讀取指定事件類型的實現函數,超時時間為相對時間:單位為Tick 
  11. LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadImp(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, 
  12.                                               UINT32 timeout, BOOL once) 
  13.     UINT32 ret = 0; 
  14.     LosTaskCB *runTask = OsCurrTaskGet(); 
  15.     runTask->eventMask = eventMask; 
  16.     runTask->eventMode = mode; 
  17.     runTask->taskEvent = eventCB;//事件控制塊 
  18.     ret = OsTaskWait(&eventCB->stEventList, timeout, TRUE);//任務進入等待狀態,掛入阻塞鏈表 
  19.     if (ret == LOS_ERRNO_TSK_TIMEOUT) {//如果返回超時 
  20.         runTask->taskEvent = NULL
  21.         return LOS_ERRNO_EVENT_READ_TIMEOUT; 
  22.     } 
  23.     ret = OsEventPoll(&eventCB->uwEventID, eventMask, mode);//檢測事件是否符合預期 
  24.     return ret; 

代碼解讀:

● 事件控制塊是給任務使用的, 任務給出讀取一個事件的條件eventMask 告訴系統屏蔽掉這些事件,對屏蔽的事件不感冒.

1. eventMask 告訴系統屏蔽掉這些事件,對屏蔽的事件不感冒.

2. eventMode 已什么樣的方式去消費事件,是必須都滿足給的條件,還是只滿足一個就響應.

3. 條件給完后,自己進入等待狀態 OsTaskWait,等待多久 timeout決定,任務自己說了算.

4. OsEventPoll檢測事件是否符合預期,啥意思?看下它的代碼就知道了.

  1. //根據用戶傳入的事件值、事件掩碼及校驗模式,返回用戶傳入的事件是否符合預期 
  2. LITE_OS_SEC_TEXT UINT32 OsEventPoll(UINT32 *eventID, UINT32 eventMask, UINT32 mode) 
  3.     UINT32 ret = 0;//事件是否發生了 
  4.  
  5.     LOS_ASSERT(OsIntLocked());//斷言不允許中斷了 
  6.     LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));//任務自旋鎖 
  7.  
  8.     if (mode & LOS_WAITMODE_OR) {//如果模式是讀取掩碼中任意事件 
  9.         if ((*eventID & eventMask) != 0) { 
  10.             ret = *eventID & eventMask; //發生了 
  11.         } 
  12.     } else {//等待全部事件發生 
  13.         if ((eventMask != 0) && (eventMask == (*eventID & eventMask))) {//必須滿足全部事件發生 
  14.             ret = *eventID & eventMask; //發生了 
  15.         } 
  16.     } 
  17.  
  18.     if (ret && (mode & LOS_WAITMODE_CLR)) {//是否清除事件 
  19.         *eventID = *eventID & ~ret;  
  20.     } 
  21.  
  22.     return ret;  

編程實例

本實例實現如下流程。

示例中,任務Example_TaskEntry創建一個任務Example_Event,Example_Event讀事件阻塞,Example_TaskEntry向該任務寫事件。可以通過示例日志中打印的先后順序理解事件操作時伴隨的任務切換。

● 在任務Example_TaskEntry創建任務Example_Event,其中任務Example_Event優先級高于Example_TaskEntry。

● 在任務Example_Event中讀事件0x00000001,阻塞,發生任務切換,執行任務Example_TaskEntry。

● 在任務Example_TaskEntry向任務Example_Event寫事件0x00000001,發生任務切換,執行任務Example_Event。

● Example_Event得以執行,直到任務結束。

● Example_TaskEntry得以執行,直到任務結束。

  1. #include "los_event.h" 
  2. #include "los_task.h" 
  3. #include "securec.h" 
  4.  
  5. /* 任務ID */ 
  6. UINT32 g_testTaskId; 
  7.  
  8. /* 事件控制結構體 */ 
  9. EVENT_CB_S g_exampleEvent; 
  10.  
  11. /* 等待的事件類型 */ 
  12. #define EVENT_WAIT 0x00000001 
  13.  
  14. /* 用例任務入口函數 */ 
  15. VOID Example_Event(VOID) 
  16.     UINT32 ret; 
  17.     UINT32 event; 
  18.  
  19.     /* 超時等待方式讀事件,超時時間為100 ticks, 若100 ticks后未讀取到指定事件,讀事件超時,任務直接喚醒 */ 
  20.     printf("Example_Event wait event 0x%x \n", EVENT_WAIT); 
  21.  
  22.     event = LOS_EventRead(&g_exampleEvent, EVENT_WAIT, LOS_WAITMODE_AND, 100); 
  23.     if (event == EVENT_WAIT) { 
  24.         printf("Example_Event,read event :0x%x\n", event); 
  25.     } else { 
  26.         printf("Example_Event,read event timeout\n"); 
  27.     } 
  28.  
  29. UINT32 Example_TaskEntry(VOID) 
  30.     UINT32 ret; 
  31.     TSK_INIT_PARAM_S task1; 
  32.  
  33.     /* 事件初始化 */ 
  34.     ret = LOS_EventInit(&g_exampleEvent); 
  35.     if (ret != LOS_OK) { 
  36.         printf("init event failed .\n"); 
  37.         return -1; 
  38.     } 
  39.  
  40.     /* 創建任務 */ 
  41.     (VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); 
  42.     task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Event; 
  43.     task1.pcName       = "EventTsk1"
  44.     task1.uwStackSize  = OS_TSK_DEFAULT_STACK_SIZE; 
  45.     task1.usTaskPrio   = 5; 
  46.     ret = LOS_TaskCreate(&g_testTaskId, &task1); 
  47.     if (ret != LOS_OK) { 
  48.         printf("task create failed .\n"); 
  49.         return LOS_NOK; 
  50.     } 
  51.  
  52.     /* 寫g_testTaskId 等待事件 */ 
  53.     printf("Example_TaskEntry write event .\n"); 
  54.  
  55.     ret = LOS_EventWrite(&g_exampleEvent, EVENT_WAIT); 
  56.     if (ret != LOS_OK) { 
  57.         printf("event write failed .\n"); 
  58.         return LOS_NOK; 
  59.     } 
  60.  
  61.     /* 清標志位 */ 
  62.     printf("EventMask:%d\n", g_exampleEvent.uwEventID); 
  63.     LOS_EventClear(&g_exampleEvent, ~g_exampleEvent.uwEventID); 
  64.     printf("EventMask:%d\n", g_exampleEvent.uwEventID); 
  65.  
  66.     /* 刪除任務 */ 
  67.     ret = LOS_TaskDelete(g_testTaskId); 
  68.     if (ret != LOS_OK) { 
  69.         printf("task delete failed .\n"); 
  70.         return LOS_NOK; 
  71.     } 
  72.  
  73.     return LOS_OK; 

運行結果

  1. Example_Event wait event 0x1  
  2. Example_TaskEntry write event . 
  3. Example_Event,read event :0x1 
  4. EventMask:1 
  5. EventMask:0 

參與貢獻

● 訪問注解倉庫地址

Fork 本倉庫 >> 新建 Feat_xxx 分支 >> 提交代碼注解 >> 新建 Pull Request

● 新建 Issue

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

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

https://harmonyos.51cto.com

 

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

2021-04-13 09:20:15

鴻蒙HarmonyOS應用開發

2021-03-11 11:14:39

鴻蒙HarmonyOS應用

2021-04-09 16:39:41

鴻蒙HarmonyOS應用

2021-04-08 09:32:17

鴻蒙HarmonyOS應用

2010-08-24 09:47:05

LINQ to SQL

2021-04-07 15:11:26

鴻蒙HarmonyOS應用

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2009-06-04 16:14:22

Hibernate一對Hibernate一對Hibernate多對

2009-07-21 17:39:50

iBATIS的多對多映

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2021-01-22 09:47:22

鴻蒙HarmonyOS應用開發

2021-03-15 15:18:16

鴻蒙HarmonyOS應用

2021-05-13 09:47:08

鴻蒙HarmonyOS應用

2020-10-10 08:57:30

網絡攻擊微盟刪庫事件網絡安全

2021-05-20 09:50:20

鴻蒙HarmonyOS應用

2020-10-23 10:10:59

Promise前端代碼

2018-08-20 16:00:23

MySQL并發控制MVCC

2010-04-15 09:09:02

Hibernate

2025-05-07 08:01:29

Ceph對象存儲

2021-05-14 10:34:29

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

久久久久成人网| 在线亚洲高清视频| 99www免费人成精品| 久久精品性爱视频| 日韩av影院| 欧美亚洲综合一区| 欧美中文字幕在线观看视频| 网站黄在线观看| 美女任你摸久久| 久久久久久成人| 国产在线综合视频| 伊人精品久久| 欧美专区日韩专区| 国产片侵犯亲女视频播放| 邻居大乳一区二区三区| 毛片av一区二区| 97视频在线免费观看| 中文字幕伦理片| 成人偷拍自拍| 欧美日韩国产区一| 男女高潮又爽又黄又无遮挡| 黄网页免费在线观看| 91免费观看在线| 91亚洲国产精品| 波多野结衣电车| 在线播放日韩| 久久天天躁狠狠躁夜夜av| 亚洲人人夜夜澡人人爽| 136福利精品导航| 欧美日韩三级一区二区| 久久精品国产sm调教网站演员| 91.xxx.高清在线| 91免费看视频| 国模精品娜娜一二三区| 国产免费无遮挡| 日产国产欧美视频一区精品| 午夜欧美大片免费观看| 男女性高潮免费网站| 波多野结衣的一区二区三区| 日韩精品免费在线视频| 又黄又色的网站| 日本少妇精品亚洲第一区| 欧美性xxxxxxxx| 成人久久久久久久久| 手机在线免费观看av| 中文字幕一区二区在线观看| 日韩免费av电影| 青青久草在线| 99国产麻豆精品| 国产伦精品一区二区三区四区免费| 999免费视频| 精品在线你懂的| 国产久一一精品| 中文字幕一级片| 蜜臀久久久99精品久久久久久| 日韩av免费网站| 日韩av大片在线观看| 一区二区三区国产盗摄 | 91精品人妻一区二区三区蜜桃欧美| 中文字幕一区日韩精品 | 青青草手机在线| 久久伊人中文字幕| 久久久久久草| 欧美色图另类| 久久精品人人做| 亚洲v欧美v另类v综合v日韩v| 国产福利在线| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 精品成人免费视频| 一本色道久久综合亚洲精品不| 97视频免费看| 一区二区三区在线观看av| 视频一区在线播放| 国产日韩一区在线| 亚洲av无码乱码国产精品久久| 丁香六月久久综合狠狠色| 久久爱av电影| sese一区| 一片黄亚洲嫩模| 91视频 -- 69xx| 播放一区二区| 日韩一级大片在线观看| 国产高清成人久久| 欧美精品一二| 久久亚洲欧美日韩精品专区| xxxx 国产| 久久视频一区| 亚洲a在线观看| 少妇高潮一区二区三区69| 国产欧美在线观看一区| dy888午夜| 涩涩涩在线视频| 欧美人狂配大交3d怪物一区| 国产精品日日摸夜夜爽| 免费观看久久av| 久久综合伊人77777尤物| 久久久久久久99| 视频一区国产视频| 懂色中文一区二区三区在线视频| 欧洲亚洲在线| 亚洲摸摸操操av| 37pao成人国产永久免费视频| 日韩深夜福利网站| 亚洲精品按摩视频| 国精产品一区一区二区三区mba | 色综合视频网站| 男人天堂av在线播放| 国产一级精品在线| 欧美大香线蕉线伊人久久国产精品| 日本免费在线视频| 亚洲国产欧美日韩另类综合| 男人添女人下面免费视频| 国产精品网址| 久久天天躁日日躁| 中文字幕69页| 成人av电影在线网| 992tv成人免费观看| 亚洲第一二三四区| 亚洲国产精品国自产拍av秋霞 | 青青一区二区三区| 欧美激情一区二区久久久| 亚洲天堂网在线视频| 91麻豆蜜桃一区二区三区| 日韩a级黄色片| 久久野战av| 亚洲精品理论电影| 国产在线视频二区| 国产精品小仙女| 先锋影音一区二区三区| 欧美日韩免费看片| 亚洲黄色av女优在线观看| 欧美日韩三级在线观看| 精品一区二区精品| 亚洲高清精品中出| 成人做爰视频www网站小优视频| 亚洲爱爱爱爱爱| 青青草原国产视频| 国产一区激情在线| 91香蕉视频网址| 国产va免费精品观看精品| 一区二区三区精品99久久| 激情五月婷婷网| 久久这里只有精品视频网| 成 年 人 黄 色 大 片大 全| 视频一区日韩精品| 欧美日韩第一视频| 精品国产无码一区二区| 亚洲乱码国产乱码精品精98午夜 | yy6080久久伦理一区二区| 亚洲人成五月天| 国产主播第一页| 亚洲国产成人自拍| 91视频免费版污| 欧美三级情趣内衣| 国产精品丝袜白浆摸在线| 天堂中文8资源在线8| 欧美日韩成人综合天天影院| 少妇高潮惨叫久久久久| 久久99国产精品久久99| 中国 免费 av| 粉嫩久久久久久久极品| 97av在线播放| 国产在线自天天| 欧美日韩精品一区二区天天拍小说| 日本在线观看网址| 国产一区二区在线电影| 国产天堂视频在线观看| 日本韩国欧美超级黄在线观看| 97香蕉超级碰碰久久免费软件| 日本韩国一区| 欧美日韩视频不卡| 国产这里有精品| 波多野洁衣一区| 不要播放器的av网站| 日韩国产综合| 97超级碰碰| 日本免费一区二区六区| 在线观看亚洲区| 国产黄a三级三级三级| 香蕉乱码成人久久天堂爱免费| 四虎国产精品成人免费入口| 久久激情五月激情| 国产freexxxx性播放麻豆| 亚洲+变态+欧美+另类+精品| 国产精品日韩欧美大师| 美足av综合网| 亚洲丝袜在线视频| 国产情侣一区二区| 欧美日韩综合视频| 精品无码一区二区三区蜜臀| 成人h动漫精品一区二区 | 国产电影一区二区三区| 免费毛片小视频| 99精品视频精品精品视频| 国产日本一区二区三区| 国产精品xxx| 欧美精品九九久久| av电影在线播放高清免费观看| 日韩手机在线导航| 国产91精品看黄网站在线观看| 亚洲婷婷在线视频| 精品少妇人妻一区二区黑料社区 | 欧美一区二区三区久久精品茉莉花 | 99久久国产综合色|国产精品| 污片在线免费看| 91久久中文| 一区二区三区一级片| 欧美电影在线观看完整版| 91久久中文字幕| 朝桐光一区二区| 久久久久久噜噜噜久久久精品| av亚洲在线| 精品一区二区亚洲| 国产激情久久久久久熟女老人av| 一本一本大道香蕉久在线精品| 久久久精品视频在线| 一区二区中文视频| 色无极影院亚洲| 不卡在线观看av| 国模大尺度视频| 久久精品国产亚洲一区二区三区| 精品中文字幕av| 亚洲三级观看| 国产91视频一区| 成人精品中文字幕| 你懂的视频在线一区二区| 风间由美一区二区av101| 91色精品视频在线| 日韩福利影视| 国产精品麻豆va在线播放| 自拍偷拍欧美视频| 91av在线影院| 99热99re6国产在线播放| 欧美日韩不卡合集视频| 91国内在线| 久久九九免费视频| 在线观看免费版| 在线观看国产成人av片| 国产成人天天5g影院在线观看| 亚洲精品中文字幕av| 日色在线视频| 精品偷拍一区二区三区在线看| 少妇精品高潮欲妇又嫩中文字幕| 精品美女被调教视频大全网站| www.成人免费视频| 日韩午夜av电影| xxxx18国产| 日韩精品一区二区三区老鸭窝 | 国产丝袜精品第一页| 婷婷五月综合激情| 日韩精品视频免费在线观看| 神马久久久久| 国产亚洲精品va在线观看| 黄色av免费在线观看| 亚洲欧洲一区二区三区在线观看| 国产专区在线播放| 在线视频日韩精品| 黄色动漫在线| 久久久免费精品视频| 激情黄产视频在线免费观看| 日本欧美一级片| 成人精品一区二区三区电影| 91精品久久久久久久久久| 96sao精品免费视频观看| 91视频在线免费观看| 国产精品香蕉| 日本亚洲欧洲精品| 911精品美国片911久久久| 国产一二三在线视频| 国产精品日本| www.这里只有精品| 国产精品 日产精品 欧美精品| 欧美xxxxx少妇| av欧美精品.com| 青娱乐国产视频| 亚洲精品国产视频| www.国产色| 欧美另类一区二区三区| 成人小说亚洲一区二区三区| 亚洲美女久久久| 快射av在线播放一区| 午夜精品一区二区三区av| 色8久久影院午夜场| 亚洲mm色国产网站| 一区二区导航| 色撸撸在线观看| 国产日韩欧美三区| 国产精品自在自线| 99精品久久只有精品| 中文字幕第69页| 五月婷婷久久丁香| 亚洲无码久久久久| 亚洲国产精品推荐| 欧美18一19xxx性| 45www国产精品网站| 亚洲高清影院| 欧美另类视频在线| 欧美黄色aaaa| 国产一区二区在线免费播放| 懂色av一区二区三区免费看| 国产黄色大片免费看| 午夜精品aaa| 国产影视一区二区| 亚洲色图av在线| 免费毛片在线看片免费丝瓜视频| 日本精品视频在线播放| 国产精品美女久久久久人| 久久波多野结衣| 欧美韩日精品| 色天使在线观看| 久久久久国色av免费看影院| 久久久久久久久久久久国产| 欧美三级电影在线观看| 天堂中文在线观看视频| 久久不射电影网| 91天天综合| 久久久久久久有限公司| 好吊视频一区二区三区四区| 91极品视频在线观看| 久久久亚洲综合| 精品在线视频免费| 日韩一级免费一区| 国产传媒在线播放| 国产精品三级在线| 国产精品自拍区| 精品久久一二三| 国产精品91一区二区| 91香蕉视频网| 欧美性xxxxxxxx| 超碰免费在线| 国产成人精品电影| 欧美做受69| 久草热视频在线观看| 国产成人av一区二区三区在线| 黄色录像免费观看| 91精品国产综合久久久久| 中文字幕在线播放| 国产精品久久久久久久app| 国产精品日韩精品中文字幕| 少妇高潮喷水久久久久久久久久| aaa亚洲精品| 日韩精品一区二区三| 精品欧美一区二区在线观看| 伊人在我在线看导航| 亚洲iv一区二区三区| 911精品美国片911久久久| 手机在线观看日韩av| 亚洲色图视频网| 99er热精品视频| 久久99精品久久久久久琪琪| 亚洲性视频在线| 99热久久这里只有精品| 国产aⅴ综合色| 国产在线欧美在线| 日韩精品视频观看| 在线国产成人影院| 伊人精品久久久久7777| 久久er精品视频| 美女福利视频在线观看| 精品国产乱码久久久久久图片| www中文字幕在线观看| 精品欧美国产| 日韩国产高清在线| 午夜精品久久久久99蜜桃最新版 | 黄色aaaaaa| 亚洲激情一二三区| 欧洲av在线播放| 青青草原成人在线视频| av一区二区在线播放| 国产5g成人5g天天爽| 亚洲综合网站在线观看| 少妇一级淫片免费看| 国产mv久久久| 婷婷久久国产对白刺激五月99| 在线观看欧美一区二区| 亚洲不卡一区二区三区| 国产资源在线播放| 91超碰在线电影| 欧美专区18| 精品国产精品国产精品| 亚洲福利在线视频| 91综合国产| 免费一级淫片aaa片毛片a级| 91香蕉视频在线| 亚洲一区二区人妻| 国语自产在线不卡| 日韩理论片av| 亚洲av人人澡人人爽人人夜夜| 色婷婷激情久久| 一色桃子av在线| 狼狼综合久久久久综合网| 久久av中文字幕片| 中文字幕一区二区三区精品| 在线成人中文字幕| 精品精品国产三级a∨在线| 亚洲黄色av网址| 亚洲不卡在线观看| 久久黄色美女电影| 欧美久久在线| 成人精品视频.|